Pregunta
He intentado esto:
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, incluso si: par1 no es nulo.
mientras
select * from table where col1 = 'asdf'
no devuelve ninguna fila.
No puedo usar gramáticas nativas porque se supone que mi aplicación se ejecuta en diferentes motores de base de datos
Solución
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 querrías algo en las líneas de:
from Table where col1 = coalesce(:par1, 'asdf')
Otros consejos
Si su base de datos subyacente es Oracle, puede usar la función nvl, la 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 diferente y puede usar la función nvl según sus requisitos si la base de datos es nvl, no estoy seguro de la implementación de las otras bases de datos, ya que he usado este código solo para Oracle. Espero que ayude.