Вопрос
Я попробовал это:
from Table where (:par1 is null or col1 = :par1)
но бывает, что
from Table where :par1 is null
всегда возвращает все строки таблицы, даже если :par1 не равен нулю.
пока
select * from table where col1 = 'asdf'
не возвращает ни одной строки.
Я не могу использовать собственные грамматики, поскольку мое приложение должно работать на разных ядрах баз данных.
Решение
Эквивалент nvl
команда в HQL — это coalesce
команда. coalesce(a,b)
вернется a
если a
не равно нулю, иначе b
.
Итак, вам нужно что-то вроде:
from Table where col1 = coalesce(:par1, 'asdf')
Другие советы
Если ваша базовая база данных — Oracle, вы можете использовать функцию nvl, я попробовал, и у меня это сработало.
Query query = session.createQuery(
" select ft from FeatureToggle ft left outer join ft.featureToggleCustomerMap "
+ " ftcm where nvl(ftcm.custId,:custId) = :custId");
query.setParameter("custId", Long.valueOf(custId));
Ваш вариант использования может быть другим, и вы можете использовать функцию nvl в соответствии с вашими требованиями, если база данных является nvl, но не уверены в реализации других баз данных, поскольку я использовал этот код только для Oracle.Надеюсь, поможет.