Non conosco le specifiche di JPQL né il modo in cui Oracle gestisce la condizione WHERE della query. Ma scommetto che la seconda parte della tua condizione WHERE è non completamente ignorata e che lo a.id = NULL
causa il problema. A parte i tipi di dati apparentemente incoerenti, una condizione come some_value = NULL
potrebbe non essere valutata su VERO o FALSO ma su NULL (almeno su PostgreSQL).
EDIT
Per il vostro caso specifico uso la condizione combinato :id IS NULL OR a.id = NULL
funziona ancora come previsto su PostgreSQL. Ma in un altro contesto non si otterrà alcuna riga con some_value = NULL
anche se some_value
è nullo. Quindi penso che per il codice robusto e comprensibile un'espressione come some_value = NULL
dovrebbe essere evitata in ogni caso.
FINE EDIT
Potreste essere in grado di aggirare il problema in JPQL con
SELECT a FROM Auftrag a WHERE :id is null OR a.id = COALESCE(:id, -1)
almeno questo è possibile con nativo Hibernate HQL. In questo caso la seconda parte della condizione WHERE restituisce FALSE se :id
è null ma l'intera condizione WHERE restituisce TRUE, che è ciò che si desidera.
Ma per le query di filtro dinamico un approccio migliore sarebbe utilizzare l'API dei criteri JPA 2.0 e includere il parametro :id
nella query solo se non è nullo. Ancora una volta, non so le specifiche di criteri di APP, ma con criteri di Hibernate nativi questo sarebbe
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();
}
Speranza che aiuta.
come è la classe Auftrag? Inoltre, la sintassi SQL sembra errata ("dove id è null", NOT "dove: id è null" ...), anche, id = null è anche la logica sbagliata. – someuser2
non proprio.prima di tutto questo non è SQL ma JPQL (ci sono alcune piccole differenze) e se vuoi impostare: id su null e la condizione dovrebbe restituire true devi scrivere ": id is null". L'affermazione risultante sarebbe "null is null" in questo caso e questo è vero, quindi la seconda condizione verrà ignorata. – MikeO
Non penso che la tua seconda condizione sia completamente ignorata. Scommetto che l'eccezione è causata dal confronto del valore numerico da a.id a null (: id) – jan