Вопрос по java – JPA Criteria API IN выражение Список параметров
Есть ли возможность использовать список параметров в 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
ответа
Не нужно использовать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
или где-нибудь еще, если это возможно?
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/…
AFAIK, никто не поддерживает их. Возможно, вам следует замкнуть запрос в случае, если в качестве аргумента передан пустой список.
Я обнаружил, что это выражение (обернутое в isTrue) вызывает исключение PREDICATE_PASSED_TO_EVALUATION в EclipseLink 2.6.2, но без обертывания isTrue прекрасно работает как предикат в моем примере, вероятно, потому что & quot; в & quot; возвращается с объектом предиката.