2012-05-24 23 views
24

¿Existe la posibilidad de utilizar una lista de parámetros en la expresión .in de API de Criteria?Criterios JPA Expresión API IN Lista de parámetros

que tienen algo como esto:

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

La expresión .value(list) no funciona como value() está esperando un parametro de tipo long no es una lista. En mi caso, no es posible usar una subconsulta. ¿Alguien puede ayudarme con este problema?

Respuesta

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

deberían hacer el truco, AFAIK.

+0

Muy bien, gracias esto funciona, pero estoy usando Hibernate y parece que Hibernate no soporta la colección vacía como parámetro de javax.persistence.criteria.Expression "en el" parámetro de método. Ver http://lists.jboss.org/pipermail/hibernate-issues/2011-December/035927.html – user1414341

+0

AFAIK, nadie los admite. Probablemente deberías cortocircuitar la consulta en caso de que se pase una lista vacía como argumento. –

+0

He encontrado que esta expresión (incluida en isTrue) plantea la excepción PREDICATE_PASSED_TO_EVALUATION en EclipseLink 2.6.2 pero sin isTrue wrapping funciona perfecto como predicado en mi ejemplo probablemente porque "in" retorna con el objeto Predicate. –

31

No es necesario usar CriteriaBuilder#isTrue. Esto debería ser suficiente:

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

En lugar de "no necesito", yo diría "no debe". Al menos usando EclipseLink 2.6.2 con seguridad. He probado. –

+0

@MiklosKrivan bien, ambos deberían funcionar, esto me parece más claro. – jFrenetic

+0

Sería de esperar, pero lamentablemente usando EclipseLink 2.6.2 para ORM (he probado ambas fórmulas), el ajuste isTrue() provoca la excepción mencionada. Es por eso que mi sugerencia de redacción dada. Entonces, teóricamente, "no hay necesidad", pero prácticamente "no debe". –

Cuestiones relacionadas