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

Posted

技术标签:

【中文标题】如何在 jpql 中为 in-clause 设置集合项?【英文标题】:How to set collection items for in-clause in jpql? 【发布时间】: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());

还有其他方法吗?

【问题讨论】:

【参考方案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 中进行了测试。

【讨论】:

以上是关于如何在 jpql 中为 in-clause 设置集合项?的主要内容,如果未能解决你的问题,请参考以下文章

Django:在表单向导中为步骤动态设置表单集

如何在 scikit-learn 中为 OneVsRestClassifier 设置类权重?

如何使用 JPQL 从 SELECT 操作中获取第一行?

如何在 Tensorflow 中为预取数据集绘制混淆矩阵

如何在 Linux 中为强命名程序集创建 .NETCore 的 snk

使用 JPQL 加入标准