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

27
demandé sur Il-Bhima 2009-03-02 11:22:13

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')
59
répondu Il-Bhima 2009-03-02 08:31:42

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.

3
répondu Vikash Mishra 2016-04-22 16:05:45