Могу ли я использовать оператор 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.


person kamaci    schedule 20.12.2010    source источник


Ответы (3)


NamedQuery

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

Установить параметры

Гибернация:

query.setParameterList('availableCollection', yourCollection);

JPA:

query.setParameter('availableCollection', yourCollection);
person Tadeusz Kopec    schedule 20.12.2010
comment
Моя переменная запроса - это переменная типа запроса. У него есть метод setParameter (), но я не видел метод setParameterList ()? Ссылка: download.oracle.com/javaee/5/api/ javax / persistence / Query.html - person kamaci; 20.12.2010
comment
import javax.persistence.Query; // Я использую этот импорт для своей переменной запроса. - person kamaci; 20.12.2010
comment
Я использовал Hibernate API. Запрос JPA действительно не имеет setParameterList метода. Согласно roseindia.net/jpa/eclipsejpaexamples/ named-parameter-list. shtml вы просто используете setParameter и передаете коллекцию. - person Tadeusz Kopec; 20.12.2010
comment
Я могу подтвердить, что при использовании JPA query.setParameter работает для списка. - person Software Prophets; 11.10.2016

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

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

(если "доступно" - строка)

or

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

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

person AlexR    schedule 20.12.2010
comment
В моей программе количество переменных будет изменяемым, в зависимости от того, может быть (1, 2) или (1, 2, 3). Поэтому я должен определить для него массив как переменную. - person kamaci; 20.12.2010

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

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

Я считаю, что это равно:

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

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

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

EDIT2 Автор редактировал вопрос столько раз, что я не могу следить за ним :) Что касается фактического вопроса о передаче массива для IN-выражения, вот ссылка на аналогичный вопрос в StackOverflow: Предложение JPQL IN - Массивы

person Art Licis    schedule 20.12.2010
comment
Мне очень жаль :), но я хотел прояснить для всех комментарии, поэтому я редактирую его, чтобы прояснить свой вопрос :) - person kamaci; 20.12.2010