API JPA Criteria API IN Liste des paramètres

Est-il possible d'utiliser une liste de paramètres dans l'API .it de Criteria?

J'ai quelque chose comme ça:

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


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

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

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

L'expression .value (list) ne fonctionne pas car value() attend un paramètre de type long non une liste. Dans mon cas, il n'est pas possible d'utiliser une sous-requête. Quelqu'un peut-il m'aider sur cette question?

0

2 Réponses

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

devrait faire l'affaire, AFAIK.

0
ajouté
Super, merci cela fonctionne, mais j'utilise Hibernate et il semble que Hibernate ne supporte pas la collection vide comme paramètre de javax.persistence.criteria.Expression "in" paramètre de la méthode. Voir lists.jboss.org/pipermail/hibernate-issues/2011 -Décembre/& hellip;
ajouté l'auteur user1414341, source
AFAIK, personne ne les soutient. Vous devriez probablement court-circuiter la requête au cas où une liste vide serait passée en argument.
ajouté l'auteur JB Nizet, source
merci beaucoup @JNBizet
ajouté l'auteur ozgur, source
J'ai trouvé cette expression (enveloppée dans isTrue) qui déclenche l'exception PREDICATE_PASSED_TO_EVALUATION dans EclipseLink 2.6.2 mais sans isTrue, l'encapsulation fonctionne parfaitement comme prédicat dans mon exemple, probablement parce que "in" renvoie avec l'objet Predicate.
ajouté l'auteur Miklos Krivan, source

Pas besoin d'utiliser CriteriaBuilder # isTrue . Cela devrait suffire:

criteriaQuery.select(bewerbung)
             .where(bewerbung.get(Bewerbung_.bewerberNummer)
             .in(list));
0
ajouté
@ MiklosKrivan bien, les deux devraient travailler, cela me semble plus clair.
ajouté l'auteur jFrenetic, source
@ MiklosKrivan devra vérifier, merci de clarifier.
ajouté l'auteur jFrenetic, source
@MiklosKrivan pouvez-vous, s'il vous plaît, partager votre trace de pile sur pastebin ou ailleurs, si possible?
ajouté l'auteur jFrenetic, source
Au lieu de "pas besoin" je dirais "ne doit pas". Au moins, utilisez EclipseLink 2.6.2 à coup sûr. J'ai testé.
ajouté l'auteur Miklos Krivan, source
Je m'y attendais aussi, mais malheureusement, en utilisant EclipseLink 2.6.2 pour ORM (j'ai essayé les deux formules) le retour isTrue() soulève l'exception mentionnée. C'est pourquoi ma suggestion de formulation est donnée. Donc théoriquement "pas besoin" mais pratiquement "ne doit pas".
ajouté l'auteur Miklos Krivan, source