How to set collection items for in-clause in jpql?

10,332

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.

Share:
10,332

Related videos on Youtube

Igor Mukhin
Author by

Igor Mukhin

Updated on May 05, 2022

Comments

  • Igor Mukhin
    Igor Mukhin about 2 years

    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?

  • Fábio Almeida
    Fábio Almeida almost 8 years
    Hi. I did what you said but it did not work to me. I´m using EclipseLink 2.5.1.