2012-12-13 5 views
9

Tablo1, tablo2 olarak adlandırılan iki tablo var.O tablolarda hiçbir alan yok. Bu iki tablo arasında bir ilişki yok. Gereksinimim tüm kayıtları istiyorum Tablo 2'de bulunmayan tablo1'de. Bu yüzden Kriter API'sini kullanarak bir sorgu yazdım. Ama doğru sonucu vermiyor. Bu JPA ve ölçüt API'sinde yeni olduğum için, herhangi birini yanlış yaptığım yeri işaret edebilirim. Aşağıdaki kodu kullanıyorum.jpa ölçütlerini kullanarak bir sorgu oluşturma api

CriteriaBuilder cb = mediationEntityManager.getCriteriaBuilder(); 
CriteriaQuery<Table1> cq = cb.createQuery(Table1.class); 
Root<Table1> table1 = cq.from(Table1.class); 
cq.select(table1) 

Subquery<Table2> subquery = cq.subquery(Table2.class) 
Root table2 = subquery.from(Table2.class) 
subquery.select(table2) 
cq.where(cb.not(cb.exists(subquery))) 
TypedQuery<Table1> typedQuery = mediationEntityManager.createQuery(cq); 
List<Table1> resultList = typedQuery.getResultList(); 

MySQL sorgu:

SELECT table1 
FROM table1 table1 
WHERE NOT EXISTS (SELECT table2 
        FROM table2 table2 
        WHERE table2.name = table1.name 
          AND table2.education = table1.education 
          AND table2.age = table1.age) 
     AND table1.name = 'san' 
     AND table1.age = '10'; 

yukarıda bahsedilen MySQL sorgusu JPA kriterleri API sorgu gerekir.

+0

Ama bu tablolarda arasında veri ayırt nasıl belirtmek kriterler/sütun vb –

+0

Merhaba ben içine ve mümkünse-ver eğer bakmak Question.Plz benim orijinal gerçek MySQL sorgusu veriyorum cevap verdiği için çok teşekkür Aynı mysql sorgu için jpa ölçütü api sorgu. – aaaa

cevap

12

Aşağıdaki kodu Kriter API'sı ile deneyebilirsiniz. Denemedim, ancak kodu buna göre değiştirmeyi deneyebilirsiniz.

CriteriaBuilder cb = mediationEntityManager.getCriteriaBuilder(); 
CriteriaQuery<Table1> query = cb.createQuery(Table1.class); 
Root<Table1> table1 = query.from(Table1.class); 
query.select(table1); 
//-- 
Subquery<Table2> subquery = query.subquery(Table2.class); 
Root<Table2> table2 = subquery.from(Table2.class); 
subquery.select(table2); 
//-- 
List<Predicate> subQueryPredicates = new ArrayList<Predicate>(); 
subQueryPredicates.add(cb.equal(table1.get(Table1_.name), table2.get(Table2_.name))); 
subQueryPredicates.add(cb.equal(table1.get(Table1_.age), table2.get(Table2_.age))); 
subQueryPredicates.add(cb.equal(table1.get(Table1_.education), table2.get(Table2_.education))); 
subquery.where(subQueryPredicates.toArray(new Predicate[]{})); 
//-- 
List<Predicate> mainQueryPredicates = new ArrayList<Predicate>(); 
mainQueryPredicates.add(cb.equal(table1.get(Table1_.name), "san"); 
mainQueryPredicates.add(cb.equal(table1.get(Table1_.age), "10"); 
mainQueryPredicates.add(cb.not(cb.exists(subquery))); 
//-- 
query.where(mainQueryPredicates.toArray(new Predicate[]{})); 
TypedQuery<Table1> typedQuery = mediationEntityManager.createQuery(query); 
List<Table1> resultList = typedQuery.getResultList(); 

Ayrıca, anlamak & hata ayıklama değiştirmek için daha kolay olan JPQL sorgusu aşağıda deneyebilirsiniz.

SELECT t1 
FROM table1 t1, 
     table2 t2 
WHERE t1.name = 'san' 
     AND t1.age = '10' 
     AND (t2.name <> t1.name 
      AND t2.education <> t1.education 
      AND t2.age <> t1.age); 
+0

Hey teşekkürler çok ... İyi çalışıyor. – aaaa

+0

@aaaa Rica ederim ve hangi yaklaşımı tercih ettiniz –

+0

Tercih ettiğim kriterler Api bcoz. – aaaa