Cómo establecer elementos de la colección en-cláusula en JPQL?
-
28-09-2019 - |
Pregunta
¿Hay una posibilidad en JPA 2.0 para establecer una colección en-cláusula en JPQL-consulta? (Estoy usando EclipseLink)
El siguiente ejemplo falla:
TypedQuery<Person> q = em.createQuery("select p from Person p where p.name in (?1)", Person.class);
List<String> names = Arrays.asList(new String[] { "Bill Gates", "Steve Jobs" });
// THIS FAILS
q.setParameter(1, names);
List<Person> persons = q.getResultList();
for (Person p: persons) {
System.out.println(p.getName());
}
¿Hay otra manera de hacerlo?
Solución
Esto es lo que la especificación JPA 2.0 dice acerca de las expresiones:
4.6.9 En las expresiones
La sintaxis para el uso de la operador de comparación [NO] EN en una expresión condicional es como sigue:
in_expression ::= {state_field_path_expression | type_discriminator} [NOT] IN { ( in_item {, in_item}* ) | (subquery) | collection_valued_input_parameter } in_item ::= literal | single_valued_input_parameter
...
Así que de acuerdo a la especificación, la sintaxis correcta cuando pase a un collection_valued_input_parameter es sin paréntesis:
select p from Person p where p.name in ?1
y esto funciona con EclipseLink.
Otros consejos
El uso de EclipseLink, es necesario utilizar un nombre a su paramether.
Ex:.
TypedQuery<Person> q = em.createQuery("select p from Person p where p.name in :names", Person.class);
List<String> names = Arrays.asList(new String[] { "Bill Gates", "Steve Jobs" });
q.setParameter("names", names);
El símbolo "?" no funciona utilizando la cláusula "en". Fue probado en EclipseLink 2.5.1.