Необязательные параметры с именованным запросом в Hibernate?
Есть ли способ указать необязательные параметры (например, когда параметры поиска предоставляются из формы, а не все параметры требуются) в именованном запросе при использовании Hibernate? Я использую собственный SQL запрос, но этот вопрос, вероятно, применим и к именованным HQL запросам.
Я почти уверен, что ответом будет "нет", но я еще не нашел окончательного ответа в документации.
Ответы
Ответ 1
AFAIK, такого нет, поэтому вам придется написать динамический запрос для этого. Возможно, посмотрите на этот предыдущий ответ, показывающий, как это сделать на HQL (который вы можете перенести в SQL), а также на то, как API Criteria упрощает его и, таким образом, лучше подходит для этой работы, на мой взгляд.,
Обновление: (отвечая на комментарий от ОП) Работа с устаревшей базой данных может быть действительно сложной с Hibernate. Возможно, вы можете использовать динамический собственный запрос и вернуть неуправляемые объекты. Но в долгосрочной перспективе все может ухудшиться (я не могу сказать это для вас). Возможно, Hibernate не лучший выбор в вашем случае, и что-то вроде iBATIS даст вам необходимую гибкость.
Ответ 2
Как упоминалось в другом ответе на вопрос, на который ссылались ранее, мне подходит следующая конструкция 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
Ответ 3
к сожалению решение в разделе "Необязательные или нулевые параметры" не работает для списков 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();
Значительная забава работает.
Ответ 4
Другим решением для обработки дополнительных параметров списка является проверка нулевого значения с помощью функции 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.
Ответ 5
Для тех, у кого проблемы со значениями NULL, другой вариант - использовать альтернативное значение. В моем случае я использовал только положительные значения для своего поля категории, что позволяет мне использовать его в качестве альтернативного значения = -1.
Поэтому, прежде чем выполнить запрос, вы можете сделать небольшую проверку:
if(value==null) {
value = -1;
}
....
....
select p from Product p WHERE :value = -1 or p.category = :value