Question
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 le: par1 n'est pas null.
pendant
select * from table where col1 = 'asdf'
ne renvoie aucune ligne.
Je ne peux pas utiliser de grammaires natives car mon application est supposée s'exécuter sur différents moteurs de base de données
La solution
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
.
Donc, vous voudriez quelque chose sur les lignes de:
from Table where col1 = coalesce(:par1, 'asdf')
Autres conseils
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, vous n'êtes pas sûr de l'implécation des autres bases de données car j'ai utilisé ce code uniquement pour Oracle. J'espère que ça aide.