Como definir itens de coleta para in-cláusula no jpql?

Existe uma possibilidade no JPA 2.0 para definir uma coleção de in-cláusula em jpql-query? (Estou usando o EclipseLink)

O próximo exemplo falha:

TypedQuery q = em.createQuery("select p from Person p where p.name in (?1)", Person.class); List names = Arrays.asList(new String[] { "Bill Gates", "Steve Jobs" }); // THIS FAILS q.setParameter(1, names); List persons = q.getResultList(); for (Person p: persons) { System.out.println(p.getName()); } 

tem outro jeito de fazer isto?

Aqui está o que a especificação JPA 2.0 diz sobre as expressões IN:

4.6.9 Em expressões

A syntax para o uso do operador de comparação [NOT] IN em uma expressão condicional é a seguinte:

 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 

Então, de acordo com a especificação, a syntax correta ao passar um collection_valued_input_parameter é sem parênteses:

 select p from Person p where p.name in ?1 

E isso funciona com o EclipseLink.

Usando o EclipseLink, você precisa usar um nome para o seu parâmetro.

Ex.:

 TypedQuery q = em.createQuery("select p from Person p where p.name in :names", Person.class); List names = Arrays.asList(new String[] { "Bill Gates", "Steve Jobs" }); q.setParameter("names", names); 

O símbolo “?” não funciona usando a cláusula “in”. Foi testado no EclipseLink 2.5.1.