2012-12-13 15 views
9

Mam dwie tabele o nazwie jak table1, table2. Oba tabele mają takie same nie pola. Nie ma związku między tymi dwoma tabelami.Moje wymagania jest chcę wszystkie rekordy w tabeli 1, których nie ma w tabeli 2. Napisałem więc zapytanie za pomocą API Criteria. Ale to nie daje prawidłowego wyniku. Ponieważ jestem nowy w tym JPA i API kryteriów, każdy może mi wskazać, gdzie robię źle. Poniższy kod używam do tego.Budowanie kwerendy za pomocą NOT EXISTS w kryteriach jpa 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 Query:

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'; 

muszę zapytanie kryteria API WZP przez wyżej wymienione zapytania MySQL.

+0

Ale jak ty różnicowania danych między tymi tabelami, należy określić kryteria/kolumna itp –

+0

Witam bardzo dziękuję za udzielenie odpowiedzi daję rzeczywistą kwerendy mysql w moim oryginalne Question.Plz nią patrzeć, a jeśli to możliwe, podać mi zapytanie dotyczące kryteriów jpa dla tego samego zapytania mysql. – aaaa

Odpowiedz

12

Możesz wypróbować poniższy kod za pomocą API Kryteriów. Nie próbowałem, ale możesz spróbować zmodyfikować kod odpowiednio.

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(); 

Ponadto, można spróbować poniżej JPQL zapytania, co jest łatwiejsze do zrozumienia, zmieniać & debug.

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

Hej, dziękuję ... Działa dobrze. – aaaa

+0

@aaaa Nie ma za co i jakie podejście preferujesz. –

+0

Preferowałem kryteria Api bcoz, które są moim wymaganiem. – aaaa

Powiązane problemy