【问题标题】:How to set collection items for in-clause in jpql?如何在 jpql 中为 in-clause 设置集合项?
【发布时间】:2011-04-22 05:31:52
【问题描述】:

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

还有其他方法吗?

【问题讨论】:

    标签: java jpa eclipselink jpa-2.0 jpql


    【解决方案1】:

    JPA 2.0 规范对 IN 表达式的规定如下:

    4.6.9 在表达式中

    使用的语法 比较运算符 [NOT] 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。

    【讨论】:

    • 嗨。我按照你说的做了,但对我没有用。我正在使用 EclipseLink 2.5.1。
    【解决方案2】:

    使用 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 中进行了测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-11
      • 2011-02-15
      • 2022-09-27
      • 2019-08-29
      • 2020-09-10
      • 1970-01-01
      • 2010-10-15
      • 2017-04-12
      相关资源
      最近更新 更多