14

We are trying to dynamically generate an IN clause for a native sql query to return a JPA entity. Hibernate is our JPA provider. Our code looks something like this.

@NamedQuery(
    name="fooQuery",
    queryString="select f from Foo f where f.status in (?1)"
)

....

Query q = entityManager.createNamedQuery("fooQuery");
q.setParameter(1, "('NEW','OLD')");
return q.getResultList();

This doesn't work, the in clause does not recognize any of the values passed in via this manner. Does anyone know of a solution to this problem?

topchef
  • 19,091
  • 9
  • 63
  • 102

2 Answers2

21

JPA supports named list parameters, in your case:

@NamedQuery(
    name="fooQuery",
    queryString="select f from Foo f where f.status in (?1)"
)

Query q = entityManager.createNamedQuery("fooQuery");

List<String> listParameter = new ArrayList<>();
listParameter.add("NEW");
listParameter.add("OLD");

q.setParameter(1, listParameter); 
return q.getResultList();
Jean-François Savard
  • 20,626
  • 7
  • 49
  • 76
topchef
  • 19,091
  • 9
  • 63
  • 102
0

I would recommend to not use a composite parameter for your query, but to split it out individually. Don't specify ('NEW','OLD'); specify separate parameters of 'NEW' and 'OLD'. That may help.

This, of course, may cause problems if your parameter lengths are undefined.

Paul Sonier
  • 38,903
  • 3
  • 77
  • 117