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
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')
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.