Как установить элементы коллекции для пункта в jpql?

Есть ли возможность в JPA 2.0 установить коллекцию для in-clause в 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());
}

Есть ли другой способ сделать это?


person Igor Mukhin    schedule 07.10.2010    source источник


Ответы (2)


Вот что говорится в спецификации JPA 2.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

...

Таким образом, согласно спецификации, правильный синтаксис при передаче коллекции_значных_входных_параметров — без круглых скобок:

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

И это работает с EclipseLink.

person Pascal Thivent    schedule 07.10.2010
comment
Привет. Я сделал то, что вы сказали, но это не сработало для меня. Я использую EclipseLink 2.5.1. - person Fábio Almeida; 14.07.2016

Используя EclipseLink, вам нужно использовать имя для вашего параметра.

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

Символ "?" не работает с предложением "in". Он был протестирован в EclipseLink 2.5.1.

person Fábio Almeida    schedule 14.07.2016