Domanda
Ho provato questo:
from Table where (:par1 is null or col1 = :par1)
ma succede che
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
Soluzione
L'equivalente del comando nvl
in HQL è il comando coalesce
. coalesce (a, b)
restituirà a
se a
non è null, altrimenti b
.
Quindi vorresti qualcosa sulle linee di:
from Table where col1 = coalesce(:par1, 'asdf')
Altri suggerimenti
Se il tuo database sottostante è Oracle, puoi usare 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 diverso e puoi usare la funzione nvl secondo i tuoi requisiti se il database è nvl, non sono sicuro dell'implosione degli altri database, poiché ho usato questo codice solo per Oracle. Spero che sia d'aiuto.