Pergunta
Eu tentei o seguinte:
from Table where (:par1 is null or col1 = :par1)
Mas acontece que
from Table where :par1 is null
Sempre retorna todas as linhas da tabela, mesmo que o: PAR1 não seja nulo.
enquanto
select * from table where col1 = 'asdf'
não retorna nenhuma linha.
Não posso usar gramáticas nativas porque meu aplicativo deve ser executado em diferentes mecanismos de banco de dados
Solução
O equivalente ao nvl
Comando em HQL é o coalesce
comando. coalesce(a,b)
retornará a
E se a
não é nulo, caso contrário b
.
Então você gostaria de algo nas linhas de:
from Table where col1 = coalesce(:par1, 'asdf')
Outras dicas
Se o seu banco de dados subjacente for o Oracle, você pode usar a função NVL, eu tentei e funcionou para mim.
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));
Seu caso de uso pode ser diferente e você pode usar a função NVL conforme o seu requisito se o banco de dados for NVL, não tem certeza sobre a implicação dos outros bancos de dados, pois usei esse código apenas para o Oracle. Espero que ajude.