Pregunta

¿Hay alguna manera de especificar los parámetros opcionales (como cuando los parámetros de búsqueda son proporcionados de una forma y no se requiere que todos los parámetros) en una consulta con nombre cuando se utiliza Hibernate ? Estoy usando un , pero la pregunta es probablemente aplicable a nombre HQL consultas también.

Estoy bastante seguro de que la respuesta a esto es 'no', pero no he encontrado la respuesta definitiva en la documentación todavía.

¿Fue útil?

Solución

Que yo sepa, no hay tal cosa por lo que tendrá que escribir una consulta dinámica para esto. Tal vez echar un vistazo a este mostrando cómo hacer esto en HQL ( que se puede incorporar a SQL) y también muestra cómo la API Criterios hace que sea más simple y por lo tanto es más adecuado para este trabajo en mi opinión.

Actualización: (en respuesta a un comentario de la OP) Trabajar con una base de datos heredada puede ser ciertamente complicado con Hibernate. Tal vez se puede utilizar una consulta nativa dinámica y volver no entidades autogestionadas de sin embargo. Pero en el largo plazo, las cosas podrían empeorar (no puedo decir que para usted). Tal vez Hibernate no es la mejor opción en su caso y algo así como iBATIS le daría la flexibilidad que necesita.

Otros consejos

Como se mencionó en un diferente a la pregunta referenciado anteriormente, el siguiente HQL construcción de obras para mí:

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

Si :value se pasa como null, se devuelven todos los productos.

Ver también Opcional o Null Parámetros

Tenga en cuenta que esto no funcionará en algunas versiones de Sybase debido a este error , por lo que la siguiente es una alternativa:

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

Por desgracia la solución bajo "Parámetros opcionales o nulo" no funciona para listas EN. Tenía que cambiar la consulta como sigue ...

Named definición de la consulta:

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

Mucha diversión de trabajo.

Otra solución para el manejo de parámetros de lista opcional es mediante la comprobación de nulo usando el Coalesce función. COALESCE es soportado por Hibernate devuelve el primer parámetro no nulo de una lista, lo que le permite comprobar nULL en una lista sin romper la sintaxis cuando hay varios elementos de la lista.

ejemplo HQL con el parámetro parámetro y lista opcional:

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

Esto funcionó para mí con un dialecto de SQL Server.

Para aquellos que tienen problemas con valores NULL, otra opción es utilizar un valor alternativo. En mi caso, he utilizado sólo valores positivos para mi campo de categoría, que me permite usar como mi valor alternativo = -1.

Por lo tanto, antes de ejecutar la consulta, se puede hacer una pequeña validación:

if(value==null) {
   value = -1;
}
....
....
select p from Product p WHERE :value = -1 or p.category = :value
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top