Необязательные параметры с именованным запросом в Hibernate? - PullRequest
29 голосов
/ 15 марта 2010

Есть ли способ указать дополнительные параметры (например, когда параметры поиска предоставляются из формы, а не все параметры требуются) в именованном запросе при использовании Hibernate ? Я использую собственный запрос SQL , но этот вопрос, вероятно, применим и к именованным запросам HQL .

Я почти уверен, что ответом будет «нет», но я еще не нашел окончательного ответа в документации.

Ответы [ 4 ]

37 голосов
/ 13 марта 2012

Как уже упоминалось в другом ответе на вопрос , на который ссылались ранее, мне подходит следующая конструкция HQL:

select o from Product o WHERE :value is null or o.category = :value

если :value передано как null, возвращаются все продукты.

См. Также Необязательные или нулевые параметры

Обратите внимание, что это не будет работать в некоторых версиях Sybase из-за этой ошибки , поэтому альтернативой является следующее:

select o from Product o WHERE isnull(:value, 1) = 1 or o.category = :value
14 голосов
/ 15 марта 2010

AFAIK, такого нет, поэтому вам придется написать динамический запрос для этого.Возможно, посмотрите на этот предыдущий ответ , показывающий, как это сделать на HQL (который вы можете перенести в SQL), а также на то, как API Criteria упрощает его и, таким образом, лучше подходит для этой работы, на мой взгляд,

Обновление: (отвечая на комментарий от OP) Работа с устаревшей базой данных может быть действительно сложной с Hibernate.Возможно, вы можете использовать динамический собственный запрос и вернуть неуправляемых объектов .Но в долгосрочной перспективе все может ухудшиться (я не могу сказать это для вас).Возможно, Hibernate не лучший выбор в вашем случае, и что-то вроде iBATIS даст вам необходимую гибкость.

7 голосов
/ 23 апреля 2012

к сожалению, решение в разделе "Необязательные или нулевые параметры" не работает для списков IN Мне пришлось изменить запрос следующим образом ...

Определение именованного запроса:

select ls from KiCOHeader co
...
join lu.handlingType ht
where (:inHandlingTypesX = 1 OR ht.name in (:inHandlingTypes))

Код:

Set<KiHandlingTypeEnum> inHandlingTypes = ...

Query query = persistence.getEm().createNamedQuery("NAMED_QUERY");
query.setParameter("inHandlingTypesX", (inHandlingTypes == null) ? 1 : 0);
query.setParameter("inHandlingTypes", inHandlingTypes);

List<KiLogicalStock> stocks = query.getResultList();

Очень весело работать.

2 голосов
/ 17 июля 2014

Другое решение для обработки необязательных параметров списка - проверка на нулевое значение с помощью функции COALESCE . COALESCE поддерживается Hibernate возвращает первый ненулевой параметр из списка, что позволяет вам проверять наличие нулевого значения в списке, не нарушая синтаксис, когда в списке несколько элементов.

Пример HQL с необязательным параметром и параметром списка:

select obj from MyEntity obj
where ( COALESCE( null, :listParameter ) is null or obj.field1 in (:listParameter) )
  and ( :parameter is null or obj.field2 = :parameter )

Это сработало для меня с диалектом SQL Server.

...