Nie znam specyfiki JPQL ani sposobu, w jaki Oracle obsługuje warunek WHERE zapytania. Ale założę się, że druga część waszego warunku WHERE to , który nie został całkowicie zignorowany: i że przyczyną problemu jest a.id = NULL
. Oprócz pozornie niespójnych typów danych warunek taki jak some_value = NULL
może nie być oceniony jako PRAWDA lub FAŁSZ, ale na NULL (przynajmniej tak się dzieje w PostgreSQL).
EDIT
dla konkretnego przypadku użycia łączny stan :id IS NULL OR a.id = NULL
nadal działa zgodnie z przeznaczeniem na PostgreSQL. Ale w innym kontekście nie dostaniesz żadnych wierszy z some_value = NULL
, nawet jeśli some_value
ma wartość null. Myślę więc, że ze względu na solidny i zrozumiały kod, należy unikać takiego wyrażenia jak some_value = NULL
.
END EDIT
może być w stanie obejść problem w JPQL z
SELECT a FROM Auftrag a WHERE :id is null OR a.id = COALESCE(:id, -1)
przynajmniej jest to możliwe z natywnym hibernacji HQL. W tym przypadku druga część warunku WHERE jest równa FALSE, jeśli :id
ma wartość null, ale cały warunek WHERE ma wartość TRUE, czyli to, czego chcesz.
Jednak w przypadku zapytań z filtrowaniem dynamicznym lepszym rozwiązaniem byłoby użycie interfejsu API kryteriów JPA 2.0 i uwzględnienie w kwerendzie parametru :id
, jeśli nie jest on pusty. Znowu, nie znam szczegółów kryteriów WZP ale z rodzimych Kryteriów Hibernate będzie to
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();
}
nadzieję, że pomoże.
Jak wygląda klasa Auftrag? Również składnia SQL wygląda źle ("gdzie id jest zerowy", NIE "gdzie: id jest zerowy" ...), również, id = null jest również błędną logiką. – someuser2
niezupełnie.po pierwsze nie jest to SQL, ale JPQL (istnieją pewne drobne różnice) i jeśli chcesz ustawić: id na null, a warunek powinien zwracać true, musisz napisać ": id is null". Wynikowa instrukcja będzie w tym przypadku "null is null", a to prawda, więc drugi warunek zostanie zignorowany. – MikeO
Nie sądzę, że twój drugi warunek jest całkowicie ignorowany. Założę się, że wyjątek spowodowany jest porównaniem numerycznego a.id do null (: id) – jan