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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top