Использование предложения IN в собственном запросе sql

Мы пытаемся динамически генерировать предложение IN для собственного SQL-запроса для возврата объекта JPA. Hibernate - наш поставщик JPA. Наш код выглядит примерно так.

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

Это не работает, предложение in не распознает любые значения, переданные с помощью этого способа. Кто-нибудь знает о решении этой проблемы?

Ответ 1

JPA поддерживает именованные параметры списка, в вашем случае:

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

Ответ 2

Я бы рекомендовал не использовать составной параметр для вашего запроса, а разделить его по отдельности. Не указывайте ('NEW','OLD'); укажите отдельные параметры 'NEW' и 'OLD'. Это может помочь.

Это, конечно, может вызвать проблемы, если длина ваших параметров undefined.