two tables query left example java hibernate orm hql named-query

java - tables - Parámetros opcionales con consulta nombrada en Hibernate?



hql left join (4)

AFAIK, no hay tal cosa, por lo que tendrá que escribir una consulta dinámica para esto. Tal vez vea esta respuesta anterior que muestra cómo hacer esto en HQL (que puede transponer a SQL) y que también muestre cómo la API de criterios 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 decirlo 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.

¿Hay alguna forma de especificar parámetros opcionales (como cuando los parámetros de búsqueda se proporcionan 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 esta pregunta es "no", pero aún no he encontrado la respuesta definitiva en la documentación.


Como se mencionó en una respuesta diferente a la question mencionada anteriormente, la siguiente construcción HQL funciona para mí:

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


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 sintaxis 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 me funcionó con un dialecto de SQL Server.


desafortunadamente, la solución en "Parámetros opcionales o nulos" no funciona para las 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<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();

Muy divertido trabajando.