Declarația API Criterii API în listă de parametri

Există posibilitatea de a utiliza o listă de parametri în expresia API Criteria .in?

Am ceva de genul:

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

Expresia .value (list) nu funcționează ca valoare () se așteaptă ca un parametru de tip nu să fie o listă lungă. În cazul meu, nu este posibil să utilizați o subchetare. Poate cineva să mă ajute în această problemă?

0

2 răspunsuri

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

ar trebui să facă truc, AFAIK.

0
adăugat
Mare, mulțumesc acestei lucrări, dar folosesc Hibernate și se pare că Hibernate nu acceptă colectarea goală ca parametru al parametrului javax.persistence.criteria.Expression "in". Consultați lists.jboss.org/pipermail/hibernate-issues/2011 -decembrie/& hellip;
adăugat autor user1414341, sursa
AFAIK, nimeni nu le suportă. Ar trebui probabil să scurtcircuitați interogarea în cazul în care o listă goală este trecută ca argument.
adăugat autor JB Nizet, sursa
vă mulțumesc foarte mult @ JBNizet
adăugat autor ozgur, sursa
Am constatat că această expresie (înfășurată în isTrue) ridică excepția PREDICATE_PASSED_TO_EVALUATION în EclipseLink 2.6.2 dar fără wrapping-ul isTrue funcționează perfect ca predicat în exemplul meu probabil pentru că "in" se întoarce cu obiectul Predicate.
adăugat autor Miklos Krivan, sursa

Nu este nevoie să utilizați CriteriaBuilder # isTrue . Acest lucru ar fi suficient:

criteriaQuery.select(bewerbung)
             .where(bewerbung.get(Bewerbung_.bewerberNummer)
             .in(list));
0
adăugat
@ MiklosKrivan bine, ambele ar trebui să funcționeze, acest lucru doar pare mai clar pentru mine.
adăugat autor jFrenetic, sursa
@ MiklosKrivan va trebui să verifice, mulțumesc pentru clarificare.
adăugat autor jFrenetic, sursa
@MiklosKrivan puteți să vă partajați următoarea stivă pe pastebin sau altundeva, dacă este posibil?
adăugat autor jFrenetic, sursa
În loc de "nu este nevoie" aș spune "nu trebuie". Cel puțin folosind EclipseLink 2.6.2 cu siguranță. Am testat.
adăugat autor Miklos Krivan, sursa
M-aș aștepta la fel de bine dar, din păcate, folosind EclipseLink 2.6.2 pentru ORM (am încercat ambele formulare), wrapping-ul isTrue() ridică excepția menționată. De aceea, sugestia mea de exprimare. Deci, teoretic "nu este nevoie", dar practic "nu trebuie".
adăugat autor Miklos Krivan, sursa