2009-03-02 27 views
27

He intentado esto:Cómo simular NVL en HQL

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

Pero sucede que

from Table where :par1 is null 

siempre devuelve todas las filas de la tabla, aunque el: par1 no es nulo.

mientras

select * from table where col1 = 'asdf' 

no devuelve ninguna fila.

no puedo usar gramáticas nativas debido a mi solicitud se supone que debe funcionar en diferentes motores de bases de datos

Respuesta

58

El equivalente al comando nvl en HQL es el comando coalesce. coalesce(a,b) devolverá a si a no es nulo, de lo contrario b.

Así que usted quiere algo en la línea de:

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

Lo que quería de hecho era: de la tabla donde col1 = coalesce (: par1, col1) y funcionó! ¡muchas gracias! –

+2

coalesce() también es una función ANSI SQL, y debería funcionar en la mayoría de las bases de datos, p. Oracle, de forma nativa. – slu

+0

también en la consulta denominada jpa entity no funcionó con nvl pero funcionó con coalesce – shareef

3

Si su base de datos subyacente es Oracle entonces usted puede utilizar la función NVL, lo probé y funcionó para mí.

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

su caso de uso puede ser diversa y se puede utilizar la función NVL como por su exigencia, si la base de datos es NVL, no está seguro acerca de la implecation de las otras bases de datos, como he utilizado este código sólo para Oracle. Espero que ayude.

+1

El OP ha mencionado que la aplicación debe ejecutarse en diferentes bases de datos. En cuyo caso, esta no es la respuesta esperada. – KNP