2012-05-24 13 views
24

Czy istnieje możliwość użycia listy parametrów w API Kryteriów .w wyrażeniu?JPA Kryteria API IN wyrażenie Lista parametrów

mam coś takiego:

List<Long> list = new ArrayList<Long>(); 
    list.add((long)1); 
    list.add((long)2); 
    list.add((long)3); 


CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Bewerbung> criteriaQuery = cb.createQuery(Bewerbung.class); 
Root<Bewerbung> bewerbung = criteriaQuery.from(Bewerbung.class); 

criteriaQuery.select(bewerbung).where(
cb.in(bewerbung.get(Bewerbung_.bewerberNummer)).value(list); 

return em.createQuery(criteriaQuery).getResultList(); 

Wyrażenie .value(list) nie działa jak value() spodziewa się paramter typu długi nie lista. W moim przypadku nie można użyć podkwerendy. Czy ktoś może mi pomóc w tej sprawie?

Odpowiedz

29
cb.isTrue(bewerbung.get(Bewerbung_.bewerberNummer).in(list)); 

powinien załatwić sprawę, AFAIK.

+0

Wielkie dzięki, to działa, ale używam Hibernacja i wydaje się, że Hibernacja nie obsługuje pustą kolekcję jako parametr javax.persistence.criteria.Expression „w” parametr metody. Zobacz http://lists.jboss.org/pipermail/hibernate-issues/2011-December/035927.html – user1414341

+0

AFAIK, nikt ich nie obsługuje. Prawdopodobnie powinieneś sprowadzić zapytanie, jeśli pusta lista zostanie przekazana jako argument. –

+0

Znalazłem to wyrażenie (owinięte w isTrue) podnosi wyjątek PREDICATE_PASSED_TO_EVALUATION w EclipseLink 2.6.2, ale bez zawijania isTrue działa idealnie jako predykat w moim przykładzie prawdopodobnie dlatego, że "w" zwraca z predykatem obiektu. –

31

Nie trzeba używać CriteriaBuilder#isTrue. To powinno wystarczyć:

criteriaQuery.select(bewerbung) 
      .where(bewerbung.get(Bewerbung_.bewerberNummer) 
      .in(list)); 
+0

Zamiast "nie ma potrzeby" powiedziałbym "nie wolno". Przynajmniej przy użyciu EclipseLink 2.6.2 na pewno. Testowałem. –

+0

@MiklosKrivan cóż, oba powinny działać, to po prostu wygląda jaśniej. – jFrenetic

+0

Spodziewałbym się tak dobrze, ale niestety przy użyciu EclipseLink 2.6.2 dla ORM (próbowałem obu formuł) otwieranie isTrue() podnosi wymieniony wyjątek. Dlatego podałem moją propozycję sformułowania. Teoretycznie "nie ma potrzeby", ale praktycznie "nie wolno". –

Powiązane problemy