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

发布于 2024-09-26 14:36:38 字数 470 浏览 3 评论 0原文

JPA 2.0 是否有可能为 jpql-query 中的子句设置集合? (我正在使用 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());
}

还有其他方法吗?

Is there a possiblity in JPA 2.0 to set a collection for in-clause in jpql-query?
(I'm using EclipseLink)

The next example fails:

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

Is there another way to do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心不设防 2024-10-03 14:36:38

以下是 JPA 2.0 规范中关于 IN 表达式的规定:

4.6.9 在表达式中

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

in_表达式 ::=
    {状态字段路径表达式| type_discriminator} [NOT] IN
        {(in_item {,in_item}*)| (子查询)|集合值输入参数 }
in_item ::= 文字 |单值输入参数

...

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

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

这适用于 EclipseLink。

Here is what the JPA 2.0 specification says about IN expressions:

4.6.9 In Expressions

The syntax for the use of the
comparison operator [NOT] IN in a
conditional expression is as follows:

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

...

So according to the specification, the correct syntax when passing a collection_valued_input_parameter is without parenthesis:

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

And this works with EclipseLink.

始终不够 2024-10-03 14:36:38

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

Using EclipseLink, you need to use a name to your paramether.

Ex.:

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

The symbol "?" does not work using clause "in". It was tested in EclipseLink 2.5.1.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文