Come simulare NVL in HQL

Ho provato questo:

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

ma succede

 from Table where :par1 is null 

restituisce sempre tutte le righe della tabella, anche se: par1 non è null.

mentre

  select * from table where col1 = 'asdf' 

non restituisce alcuna riga.

Non posso usare grammatiche native perché la mia applicazione dovrebbe funzionare su diversi motori di database

L’equivalente del comando nvl in HQL è il comando di coalesce . coalesce(a,b) restituirà a se a non è nullo, altrimenti b .

Quindi vorresti qualcosa sulla falsariga di:

 from Table where col1 = coalesce(:par1, 'asdf') 

Se il database sottostante è Oracle, puoi utilizzare la funzione nvl, l’ho provato e ha funzionato per me.

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

Il tuo caso d’uso può essere diffrente e puoi utilizzare la funzione nvl secondo i tuoi requisiti se il database è nvl, non sono sicuro riguardo l’implacazione degli altri database, poiché ho usato questo codice solo per Oracle. Spero che sia d’aiuto.