Как симулировать NVL в HQL - PullRequest
29 голосов
/ 02 марта 2009

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

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

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

from Table where :par1 is null

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

, а

 select * from table where col1 = 'asdf'

не возвращает ни одной строки.

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

Ответы [ 2 ]

62 голосов
/ 02 марта 2009

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

Итак, вы хотели бы что-то вроде:

from Table where col1 = coalesce(:par1, 'asdf')
3 голосов
/ 22 апреля 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...