2009-03-02 22 views
27

ho provato questo:Come simulare NVL in HQL

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 il: par1 non è nullo.

mentre

select * from table where col1 = 'asdf' 

non restituisce qualsiasi riga.

non posso usare le grammatiche native perché la mia domanda è supposto per funzionare su diversi motori di database

risposta

58

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

Così si vorrebbe qualcosa sulla falsariga di:

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

Quello che volevo in realtà era: dalla tabella dove col1 = coalesce (: par1, col1) e ha funzionato! molte grazie! –

+2

coalesce() è anche una funzione ANSI SQL e dovrebbe funzionare sulla maggior parte dei database, ad es. Oracle, in modo nativo. – slu

+0

anche nell'entità jpa denominata query che non ha funzionato con nvl ma ha funzionato con coalesce – shareef

3

Se il database sottostante è Oracle quindi è possibile utilizzare la funzione NVL, 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)); 

vostro caso d'uso può essere differente ed è possibile utilizzare la funzione NVL secondo il vostro requisito se il database è NVL, non sono sicura del implecation degli altri database, come ho utilizzato questo codice solo per Oracle. Spero che aiuti.

+1

L'OP ha menzionato che l'app deve essere eseguita su diversi database. In tal caso, questa non è la risposta prevista. – KNP