Подтвердить что ты не робот

Необязательные параметры с именованным запросом в Hibernate?

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

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

4b9b3361

Ответ 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