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

JPA2.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」を使用しても機能しません。EclipseLink2.5.1でテストされました。

于 2016-07-14T13:14:41.190 に答える