web-dev-qa-db-fra.com

Comment simuler NVL dans HQL

J'ai essayé ceci:

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

mais il arrive que

from Table where :par1 is null

renvoie toujours toutes les lignes de la table, même si: par1 n'est pas nul.

tandis que

 select * from table where col1 = 'asdf'

ne renvoie aucune ligne.

Je ne peux pas utiliser de grammaires natives car mon application est censée s'exécuter sur différents moteurs de base de données

29
Pau

L'équivalent de la commande nvl dans HQL est la commande coalesce. coalesce(a,b) renverra a si a n'est pas nul, sinon b.

Vous voudriez donc quelque chose comme:

from Table where col1 = coalesce(:par1, 'asdf')
62
Il-Bhima

Si votre base de données sous-jacente est Oracle, vous pouvez utiliser la fonction nvl, je l'ai essayée et cela a fonctionné pour moi.

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

Votre cas d'utilisation peut être différent et vous pouvez utiliser la fonction nvl selon vos besoins si la base de données est nvl, je ne suis pas sûr de l'implémentation des autres bases de données, car j'ai utilisé ce code uniquement pour Oracle. J'espère que ça aide.

3
Vikash Mishra