2009-03-02 12 views
27

ich versuchte, diese:Wie NVL in HQL zu simulieren

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

aber es kommt vor, dass

from Table where :par1 is null 

alle Zeilen der Tabelle immer wieder, auch wenn das: par1 nicht null ist.

während

select * from table where col1 = 'asdf' 

keine Zeile zurück.

Ich kann nicht native Grammatiken verwenden, da meine Anwendung soll auf verschiedenem Datenbank-Engines in HQL ist der coalesce Befehl

Antwort

58

Das entspricht den nvl Befehl auszuführen. coalesce(a,b) wird a zurückgegeben, wenn a nicht null ist, sonst b.

Also würde man etwas auf den Linien wollen:

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

Was ich eigentlich wollte war: aus Tabelle wo col1 = coalesce (: par1, col1) und es hat funktioniert! Danke vielmals! –

+2

coalesce() ist auch eine ANSI-SQL-Funktion und sollte in den meisten Datenbanken funktionieren, z. Oracle, nativ. – slu

+0

auch in jpa-Einheit namens Abfrage es nicht mit nvl gearbeitet, aber mit Coalesce – shareef

3

Wenn die zugrunde liegende Datenbank ist Oracle dann können Sie die NVL-Funktion verwenden, ich habe es ausprobiert und es funktionierte für mich.

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

Ihr Anwendungsfall kann diffrent sein und Sie die Funktion NVL wie pro Ihre Anforderung verwenden können, wenn die Datenbank NVL ist, nicht sicher über die implecation der anderen Datenbanken, wie ich diesen Code nur für Oracle verwendet haben. Hoffe es hilft.

+1

gearbeitet Das OP hat erwähnt, dass die App auf verschiedenen Datenbanken laufen muss. In diesem Fall ist dies nicht die erwartete Antwort. – KNP