Могу ли я использовать оператор SQL IN(...) для namedQuery?

Как я могу использовать IN в моем namedQuery?

@NamedQueries(  
 {   
 @NamedQuery(name = "GetAvailableProducts", query = new StringBuilder("").append("SELECT   p   FROM Product p WHERE p.type= :type AND (p.available IN ('I want to define changeable size of an array or sometinhg like that') OR p.available = :available)")),  
 }

Я имею в виду, что я могу установить параметр 'type' (я определил его как переменную ---->:type), и я хочу определить переменные внутри оператора IN для. Однако количество параметров не является постоянным. Я хочу определить массив или что-то в этом роде:array[], и я хочу установить его, когда я вызываю этот namedQuery.

3 ответа

Решение

NamedQuery

@NamedQueries(  
{   
 @NamedQuery(name = "GetAvailableProducts", query = "FROM Product p WHERE p.type= :type AND (p.available IN (:availableCollection) OR p.available = :available)",  
}

Set parameters

Спящий режим:

query.setParameterList('availableCollection', yourCollection);

JPA:

query.setParameter('availableCollection', yourCollection);

Вы пробовали что-то вроде

SELECT   p   FROM Product p WHERE p.type= :type AND (p.available IN 
('foo', 'bar') OR p.available = :available)

(если "доступно" является строкой)

или же

SELECT   p   FROM Product p WHERE p.type= :type AND (p.available IN 
(1, 2, 3) OR p.available = :available)

(если есть номер)?

Выражение "IN" в JPQL равнозначно написанию нескольких операторов "ИЛИ", в вашем случае примером "IN" будет:

... p.available IN ('US', 'GB') ...

Который я считаю равным:

... p.available = 'US' OR p.available = 'GB' ...

Вот ссылка, которая хорошо объясняет это: OpenJPA: IN Expression

РЕДАКТИРОВАТЬ PS Предполагая, что p.available это String (тип символа)

РЕДАКТИРОВАТЬ2 Автор столько раз редактировал вопрос, что я не могу его отследить:) Что касается фактического вопроса о передаче массива для IN-выражения, вот ссылка на аналогичный вопрос в Stackru: предложение JPQL IN - Массивы

Другие вопросы по тегам