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

Как имитировать NVL в HQL

Я пробовал это:

from Table where (:par1 is null or col1 = :par1)

но бывает, что

from Table where :par1 is null

всегда возвращает все строки таблицы, даже если: par1 не является нулевым.

а

 select * from table where col1 = 'asdf'

не возвращает строку.

Я не могу использовать собственные грамматики, потому что мое приложение должно работать на разных ядрах базы данных

4b9b3361

Ответ 1

Эквивалент команде nvl в HQL - это команда coalesce. coalesce(a,b) вернет a, если a не является нулевым, иначе b.

Итак, вам нужно что-то в строках:

from Table where col1 = coalesce(:par1, 'asdf')

Ответ 2

Если ваша базовая база данных - это 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. Надеюсь, что это поможет.