No conozco los detalles de JPQL ni cómo maneja Oracle la condición WHERE de su consulta. Pero apostaría a que la segunda parte de su condición WHERE es no ignorada por completo y que a.id = NULL
está causando el problema. Aparte de los tipos de datos aparentemente inconsistentes, una condición como some_value = NULL
no puede evaluarse como VERDADERO o FALSO sino como NULO (al menos esto sucede en PostgreSQL).
EDITAR
Para su caso de uso específico de la condición combinada :id IS NULL OR a.id = NULL
todavía funciona como está previsto en PostgreSQL. Pero en otro contexto, no obtendrá ninguna fila con some_value = NULL
, incluso si some_value
es nulo. Por lo tanto, creo que, en aras de un código sólido y comprensible, se debe evitar en cualquier caso una expresión como some_value = NULL
.
FIN EDITAR
Usted puede ser capaz de solucionar el problema en JPQL con
SELECT a FROM Auftrag a WHERE :id is null OR a.id = COALESCE(:id, -1)
al menos esto es posible con Hibernate HQL nativa. En este caso, la segunda parte de la condición WHERE se evalúa como FALSE si :id
es nulo, pero la condición WHERE completa se evalúa como TRUE, que es lo que desea.
Pero para las consultas de filtrado dinámico, un mejor enfoque sería utilizar la API de criterios de JPA 2.0 e incluir el parámetro :id
en la consulta solo si no es nulo. Una vez más, no sé los detalles de los criterios de la APP pero con criterios de Hibernate nativas esto sería
public List<Auftrag> findByFilter(Long id) {
Criteria criteria = session.createCriteria(Auftrag.class);
if (id != null) {
criteria.add(Restrictions.eq("id", id));
} // if
return criteria.list();
}
Espero que ayude.
¿Cómo es la clase Auftrag? Además, la sintaxis de SQL parece incorrecta ("donde id es nulo", NO "donde: id es nulo" ...), también, id = null también es una lógica incorrecta. – someuser2
no realmente.en primer lugar, esto no es SQL sino JPQL (hay algunas diferencias menores) y si quiere establecer: id a null y la condición debe devolver verdadero, debe escribir ": id is null". La declaración resultante sería "nulo es nulo" en ese caso y esto es cierto, por lo que la segunda condición será ignorada. – MikeO
No creo que su segunda condición sea ignorada por completo. Apuesto a que la excepción es causada por la comparación de la a.id numérica con la nula (: id) – jan