如何在jpql中为in-clause设置集合项?

JPA 2.0中是否有可能在jpql-query中为in-clause设置集合? (我正在使用EclipseLink)

下一个示例失败:

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

还有另一种方法吗?

以下是JPA 2.0规范关于IN表达式的内容:

4.6.9表达式

在条件表达式中使用比较运算符[NOT] IN的语法如下:

 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 

因此,根据规范,传递collection_valued_input_parameter时的正确语法不带括号:

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

这适用于EclipseLink。

使用EclipseLink,您需要为参数使用名称。

例:

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

符号“?” 使用“in”子句不起作用。 它在EclipseLink 2.5.1中进行了测试。