Вопрос по java – JPA Criteria API IN выражение Список параметров

25

Есть ли возможность использовать список параметров в Criteria API .in выражении?

У меня есть что-то вроде этого:

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

Выражение.value(list) не работает какvalue() ожидает параметр типа долго не список. В моем случае невозможно использовать подзапрос. Может кто-нибудь помочь мне в этом вопросе?

Ваш Ответ

2   ответа
34

Не нужно использоватьCriteriaBuilder#isTrue, Этого должно быть достаточно:

criteriaQuery.select(bewerbung)
             .where(bewerbung.get(Bewerbung_.bewerberNummer)
             .in(list));
Вместо «нет необходимости» Я бы сказал, "не должен". По крайней мере, использовать EclipseLink 2.6.2 точно. Я проверил.
@MiklosKrivan придется проверить, спасибо за разъяснения.
@MiklosKrivan хорошо, оба должны работать, мне это кажется более понятным.
Я бы тоже так ожидал, но, к сожалению, используя EclipseLink 2.6.2 для ORM (я пробовал обе формулы), обертка isTrue () вызывает упомянутое исключение. Именно поэтому мои формулировки предложены. Так что теоретически «нет необходимости» но практически "не должен".
@MiklosKrivan Вы можете поделиться своим стэкомpastebin или где-нибудь еще, если это возможно?
32
cb.isTrue(bewerbung.get(Bewerbung_.bewerberNummer).in(list));

должен сделать свое дело, AFAIK.

большое спасибо @JBNizet
Отлично, спасибо, это работает, но я использую Hibernate, и кажется, что Hibernate не поддерживает пустую коллекцию в качестве параметра javax.persistence.criteria.Expression & quot; in & quot; параметр метода. Увидетьlists.jboss.org/pipermail/hibernate-issues/2011-December/… user1414341
AFAIK, никто не поддерживает их. Возможно, вам следует замкнуть запрос в случае, если в качестве аргумента передан пустой список.
Я обнаружил, что это выражение (обернутое в isTrue) вызывает исключение PREDICATE_PASSED_TO_EVALUATION в EclipseLink 2.6.2, но без обертывания isTrue прекрасно работает как предикат в моем примере, вероятно, потому что & quot; в & quot; возвращается с объектом предиката.

Похожие вопросы