Comment simuler les NVL en 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 le :par1 n'est pas null.
select * from table where col1 = 'asdf'
ne retourne aucune ligne.
Je ne peux pas utiliser de grammaires natives parce que mon application est censée fonctionner sur des moteurs de base de données différents
2 réponses
l'équivalent de nvl
commande en HQL est le coalesce
la commande. coalesce(a,b)
retour a
si a
n'est pas nul, sinon b
.
alors vous voudriez quelque chose sur les lignes de:
from Table where col1 = coalesce(:par1, 'asdf')
si votre base de données sous-jacente est Oracle alors vous pouvez utiliser la fonction nvl, Je l'ai essayé et il 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 diffrent et vous pouvez utiliser la fonction nvl selon vos exigences si la base de données est nvl, pas sûr de l'implantation des autres bases de données, comme je l'ai utilisé ce code seulement pour Oracle. Espérons que cela aide.