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

时间:2010-10-07 07:39:53

标签: java jpa eclipselink jpa-2.0 jpql

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

下一个例子失败了:

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

还有其他办法吗?

2 个答案:

答案 0 :(得分:8)

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

  

4.6.9在表达式中

     

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

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。

答案 1 :(得分:0)

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

例:

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

符号&#34;?&#34;在&#34;中使用&#34;中的子句不起作用。它在EclipseLink 2.5.1中进行了测试。