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

StackOverflow https://stackoverflow.com/questions/2444603

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

Как упоминалось в другой ответ к тому вопрос упомянутая ранее, следующая конструкция 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

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

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

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();

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

Другим решением для обработки необязательных параметров списка является проверка на null с помощью СЛИВАТЬСЯ функция.СЛИВАТЬСЯ - это поддерживается Hibernate возвращает первый ненулевой параметр из списка, позволяющий проверять наличие null в списке без нарушения синтаксиса при наличии нескольких элементов в списке.

Пример 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.

Для тех, у кого возникли проблемы с нулевыми значениями, другим вариантом является использование альтернативного значения.В моем случае я использовал только положительные значения для своего поля категории, что позволяет мне использовать в качестве альтернативного значения = -1.

Поэтому, прежде чем выполнить запрос, вы можете произвести небольшую проверку:

if(value==null) {
   value = -1;
}
....
....
select p from Product p WHERE :value = -1 or p.category = :value
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top