6

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

还有另一种方法吗?

4

2 回答 2

8

以下是 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。

于 2010-10-07T08:23:25.973 回答
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);

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

于 2016-07-14T13:14:41.190 回答