Hay alguna forma de especificar los parámetros opcionales (tales como cuando los parámetros de búsqueda son proporcionados de una forma y no todos los parámetros son obligatorios) en un nombre de consulta cuando se utilizan Hibernate? Estoy usando un nativo SQL consulta, pero la pregunta es, probablemente, aplicables a nombre HQL consultas.

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

InformationsquelleAutor Ickster | 2010-03-15

4 Comentarios

  1. 14

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

    Actualización: (en respuesta a un comentario de la OP) Trabajo con un legado de la base de datos puede ser, en efecto, difícil con Hibernate. Tal vez usted puede utilizar una dinámica de consulta nativa y volver no logró entidades aunque. Pero en el largo plazo, las cosas podrían ir a peor (no le puedo decir que para usted). Tal vez Hibernación no es la mejor opción en su caso y en algo así como iBATIS que le dan la flexibilidad que usted necesita.

    • Gracias. Eso es bastante más de lo que me imaginé. Estoy familiarizado con ambos de los métodos que se sugieren en su otra respuesta, pero estoy atascado con una pesadilla legado db esquema que simplemente no se adapta bien a la Hibernación enfoque para mi caso en particular. Yo la he hecho hasta ahora, pero tienen algunos de los nuevos requisitos que simplemente parece que no puede encontrar utilizando la recta de mapeo Hibernate. Que probablemente voy a dar y utilizar iBATIS para este caso. No es real encantados de añadir otra tecnología a la pila como una curita, pero eso es la vida, supongo. Gracias.
    • Ver mis actualizaciones.
    • Gracias por la actualización. He considerado la posibilidad de que el enfoque y teniendo en cuenta el número de parámetros estoy tratando, he decidido que es probablemente el limpiador de usar sólo iBATIS. Gracias por el consejo.
  2. 37

    Como se mencionó en un respuesta diferente a la pregunta que se hace referencia anteriormente, los siguientes HQL construir obras para mí:

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

    si :value se pasa como null, todos los Productos son devueltos.

    Ver también Opcional o Nulo Parámetros

    Tenga en cuenta que esto no funciona 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
    • Cuando se utiliza ‘:el valor es null’, me sale el error «el uso Ilegal de la palabra clave NULL’. Cuando se utiliza «isnull(:valor, 1) = 1′, me sale error «La izquierda de expresión no es una expresión válida’.
    • también puede utilizar .. WHERE isnull(:value, o.category) = o.category ..
  3. 7

    por desgracia la solución bajo «Opcional o Nulo de los Parámetros de» no trabajar EN las listas.
    Tuve que cambiar la consulta es la siguiente …

    Denominado definición de 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();

    Divertido trabajo.

    • que ya no funcionan..
  4. 2

    Otra solución para el manejo de la lista opcional de parámetros es el chequeo para el uso de null el Se UNEN función. Se UNEN es apoyado por Hibernate devuelve el primer no-null parámetro a partir de una lista, que permite comprobar el valor null en una lista sin romper la sintaxis cuando hay varios elementos en la lista.

    HQL ejemplo con el parámetro opcional y la lista de parámetros:

    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 Servidor SQL server dialecto.

    • Esto no funciona para mí, hibernate se quejó COALESCE(null, ) cuando :listParameter no fue definido. Mi solución fue también para pasar un parámetro adicional y tener la condición where escrito de este modo: (:listParamterSize = 0 or obj.field1 in (:listParameter))
    • Funciona, pero :listParameter debe ser definido, al menos como null. La ventaja de esta solución es que puede pasar el parámetro como null y no hay ninguna necesidad de que el parámetro adicional.

Dejar respuesta

Please enter your comment!
Please enter your name here