Pergunta

Existe alguma maneira de especificar parâmetros opcionais (como quando os parâmetros de pesquisa são fornecidos a partir de um formulário e nem todos os parâmetros são necessários) em uma consulta nomeada ao usar Hibernate? Estou usando um nativo SQL consulta, mas a pergunta é provavelmente aplicável a nomeado HQL consultas também.

Tenho certeza de que a resposta para isso é 'não', mas ainda não encontrei a resposta definitiva na documentação.

Foi útil?

Solução

Afaik, não existe tal coisa, então você terá que escrever uma consulta dinâmica para isso. Talvez dê uma olhada nisso resposta anterior Mostrar como fazer isso no HQL (que você pode transpor para o SQL) e também mostrar como a API de critérios o torna mais simples e, portanto, é mais adequado para esse trabalho na minha opinião.

Atualizar: (Respondendo a um comentário do OP) Trabalhando com um banco de dados herdado pode ser realmente complicado com o Hibernate. Talvez você possa usar uma consulta nativa dinâmica e retornar entidades não gerenciadas no entanto. Mas, a longo prazo, as coisas podem piorar (não posso dizer isso para você). Talvez o Hibernate não seja a melhor escolha no seu caso e algo como o ibatis lhe daria a flexibilidade de que você precisa.

Outras dicas

Como mencionado em um resposta diferente para o pergunta Referenciado anteriormente, o seguinte construto HQL funciona para mim:

select o from Product o WHERE :value is null or o.category = :value

E se :value é passado como null, todos os produtos são devolvidos.

Veja também Parâmetros opcionais ou nulos

Observe que isso não funcionará em algumas versões de Sybase devido a este bug, então a seguir é uma alternativa:

select o from Product o WHERE isnull(:value, 1) = 1 or o.category = :value

Infelizmente, a solução em "parâmetros opcionais ou nulos" não funciona nas listas. Eu tive que mudar a consulta como seguinte ...

Definição de consulta nomeada:

select ls from KiCOHeader co
...
join lu.handlingType ht
where (:inHandlingTypesX = 1 OR ht.name in (:inHandlingTypes))

Código:

Set<KiHandlingTypeEnum> inHandlingTypes = ...

Query query = persistence.getEm().createNamedQuery("NAMED_QUERY");
query.setParameter("inHandlingTypesX", (inHandlingTypes == null) ? 1 : 0);
query.setParameter("inHandlingTypes", inHandlingTypes);

List<KiLogicalStock> stocks = query.getResultList();

Muito divertido trabalhando.

Outra solução para lidar com os parâmetros da lista opcional é verificando nulo usando o Coalesce função. Coalesce é Apoiado por Hibernate Retorna o primeiro parâmetro não nulo de uma lista, permitindo que você verifique o NULL em uma lista sem quebrar a sintaxe quando houver vários itens na lista.

Exemplo HQL com parâmetro opcional e parâmetro de lista:

select obj from MyEntity obj
where ( COALESCE( null, :listParameter ) is null or obj.field1 in (:listParameter) )
  and ( :parameter is null or obj.field2 = :parameter )

Isso funcionou para mim com um dialeto do SQL Server.

Para aqueles que têm problemas com valores nulos, outra opção é usar um valor alternativo. No meu caso, usei apenas valores positivos para o meu campo de categoria, que me permite usar como meu valor alternativo = -1.

Portanto, antes de executar a consulta, você pode fazer uma pequena validação:

if(value==null) {
   value = -1;
}
....
....
select p from Product p WHERE :value = -1 or p.category = :value
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top