Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在jpql中为in子句设置集合项?_Java_Jpa_Eclipselink_Jpa 2.0_Jpql - Fatal编程技术网

Java 如何在jpql中为in子句设置集合项?

Java 如何在jpql中为in子句设置集合项?,java,jpa,eclipselink,jpa-2.0,jpql,Java,Jpa,Eclipselink,Jpa 2.0,Jpql,JPA2.0中是否有可能在jpql查询中为in子句设置集合? (我正在使用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" }

JPA2.0中是否有可能在jpql查询中为in子句设置集合? (我正在使用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());
}
TypedQuery q=em.createQuery(“从Person p中选择p,其中p.name位于(?1)”,Person.class);
List name=Arrays.asList(新字符串[]{“比尔·盖茨”、“史蒂夫·乔布斯”});
//这失败了
q、 setParameter(1,名称);
List persons=q.getResultList();
用于(人员p:人员){
System.out.println(p.getName());
}

还有其他方法吗?

以下是JPA 2.0规范在表达式中的说明:

4.6.9在表达式中 使用的语法 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

因此,根据规范,传递集合\值\输入\参数时的正确语法不带括号:

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

这适用于EclipseLink。

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

例:

TypedQuery q=em.createQuery(“从Person p中选择p,其中p.name位于:names”,Person.class);
List name=Arrays.asList(新字符串[]{“比尔·盖茨”、“史蒂夫·乔布斯”});
q、 setParameter(“名称”,名称);

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

Hi。我照你说的做了,但对我不起作用。我正在使用EclipseLink 2.5.1。
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);