Tengo una HQL declaración así:

Select cast(ed.employee.employeeID as int) AS emp_id FROM Education AS ed WHERE ed.type.name IN (:typeNames)

A veces, sin embargo, typeNames está vacía. Esto hace que la siguiente:

org.hibernate.hql.ast.QuerySyntaxException: unexpected end of subtree [Select cast(ed.employee.employeeID as int) AS emp_id FROM Education AS ed WHERE ed.type.name IN ()]

¿Cuál es la solución para hacer que se acepte una lista vacía?

cuál debería ser el comportamiento si la lista está vacía – conseguir que todos, o que no reciben nada ?
No debe devolver ningún resultado si no hay una lista vacía
No puede revisar la lista antes de pasar como argumento a la consulta HQL? Creo HQL sólo refleja el comportamiento de SQL, que también va a tirar un error si se intenta hacer una EN() consulta?
Estoy de acuerdo con Ted. si usted está buscando una lista vacía en esta condición, ¿por qué ejecutar la consulta a todos 🙂
Hay un (actualmente) abrió error en Hibernación jira acerca de vacío EN el (los) problema: hibernate.atlassian.net/browse/HHH-8091

OriginalEl autor Derek | 2011-12-09

3 Comentarios

  1. 2

    Una solución que he usado, sería colocar algo de valor ficticio en la lista junto con su entrada para asegurarse de que nunca se vacía. Por supuesto, sólo puede hacerlo si el valor ficticio puede ser elegido.

    Si su lista de entrada es typeNamesOrig:

    List<String> typeNames = new ArrayList<String>(typeNamesOrig);
    typeNames.add("valueThatDoesNotExistForSure");
    query.setParameterList("typeNames",typeNames);
    Esto no va a funcionar cuando se utiliza una colección de las enumeraciones. Ya que sólo se pueden utilizar los valores enum y no sólo a algunos no cadena existente, las posibilidades son muy altas de que cada valor de enumeración sería una devolución de uno o más resultados. Y la creación de un extra de VACÍO el valor de enumeración sólo para este propósito sería una exageración y muy feo.
    Que la solución resuelve un problema y se introduce uno nuevo en el mismo tiempo, yo recomendaría a considerar otras respuestas.
    No hay ningún otro legítimo respuestas aquí, aunque… 🙁

    OriginalEl autor Alex Gitelman

  2. 13

    Si typeNames está vacío o nulo, lo que probablemente no ejecutar la consulta:

    if (typeNames) result = Foo.executeQuery("select ... where e.type.name in :typeNames", [typeNames: typeNames)
    Puede usted explicar por qué no? Como cualquier tipo de nombre nunca será incluido en una lista vacía, yo esperaría que nada puede ser seleccionado. Por lo tanto el resultado conjunto es vacío.
    Sobre todo porque se ahorra un viaje redondo a la base de datos para determinar algo que nos puede conocer en el código, también debido a que se trabaja en torno a la cuestión en modo de hibernación que las fuerzas de cosas como el aceptado responder a poner un valor ficticio en la lista.
    A veces no se puede evitar la ejecución. Tengo el mismo problema y la consulta tiene una O en la cláusula where. Todos los demás se unen los parámetros tienen valores válidos y la consulta devuelve resultados, incluso cuando la lista está vacía. Es peligroso usar valores ficticios en mi escenario tan callejón sin salida. ¿Hay alguna otra solución?

    OriginalEl autor Ted Naleid

  3. -1

    El valor ficticio es sin duda la solución más fácil, excepto que nunca se sabe para asegurarse de que el valor no existe. La mejor cosa que puedes hacer es agregar otra variable para indicar que la lista está vacía.

    select *
    from books
    where id in (:ids) and :listHasItems = 1

    si su lista no tiene los elementos de agregar un id aleatorio y establecer listHasItems a 0.

    Creo que esto sería el resultado de SQL no válido
    Esto no va a funcionar ya que IN () no es válido SQL.

    OriginalEl autor Nactive

Dejar respuesta

Please enter your comment!
Please enter your name here