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?

0

2 Answers 2

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();
Sign up to request clarification or add additional context in comments.

2 Comments

This is not a Native Query, so I guess it's not an acceptable answer?
JPA will generate SQL query with IN clause parameterized from Java list - resulting SQL query will contain native (SQL) IN clause.
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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.