Parámetros opcionales con consulta con nombre en Hibernate?

¿Hay alguna forma de especificar parámetros opcionales (como cuando se proporcionan los parámetros de búsqueda desde un formulario y no se requieren todos los parámetros) en una consulta con nombre cuando se utiliza Hibernate ? Estoy usando una consulta SQL nativa, pero la pregunta probablemente sea aplicable también a las consultas HQL nombradas.

Estoy bastante seguro de que la respuesta a esto es ‘no’, pero aún no he encontrado la respuesta definitiva en la documentación.

AFAIK, no hay tal cosa, por lo que tendrá que escribir una consulta dinámica para esto. Tal vez eche un vistazo a esta respuesta previa que muestra cómo hacer esto en HQL (que puede transponer a SQL) y también muestra cómo la API Criteria lo hace más simple y, por lo tanto, es más adecuado para este trabajo en mi opinión.

Actualización: (responder a un comentario del OP) Trabajar con una base de datos heredada puede ser realmente complicado con Hibernate. Tal vez pueda usar una consulta nativa dinámica y devolver entidades no administradas . Pero a la larga, las cosas podrían empeorar (no puedo decir eso por ti). Tal vez Hibernate no sea la mejor opción en su caso y algo como iBATIS le daría la flexibilidad que necesita.

Como mencioné en una respuesta diferente a la pregunta mencionada anteriormente, la siguiente construcción HQL me funciona:

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

si: el valor se pasa como nulo, se devuelven todos los Productos.

Véase también Parámetros opcionales o nulos

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 

Desafortunadamente, la solución en “Parámetros opcionales o nulos” no funciona para listas IN. Tuve que cambiar la consulta de la siguiente manera …

Definición de consulta con nombre:

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

Código:

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

Muy divertido trabajando.

Otra solución para manejar los parámetros de la lista opcional es verificando el valor nulo utilizando la función COALESCE . COALESCE es compatible con Hibernate. Devuelve el primer parámetro no nulo de una lista, lo que le permite verificar si hay un valor nulo en una lista sin romper la syntax cuando hay varios elementos en la lista.

Ejemplo de HQL con parámetro opcional y 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 ) 

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