Ответ 1
Я не знаю специфики JPQL и того, как Oracle обрабатывает условие WHERE вашего запроса. Но я бы сказал, что вторая часть вашего условия WHERE не полностью игнорируется и что проблема a.id = NULL
вызывает проблему. Помимо явно несогласованных типов данных условие типа some_value = NULL
может не оцениваться как TRUE или FALSE, а NULL (по крайней мере, это происходит на PostgreSQL).
РЕДАКТИРОВАТЬ
Для вашего конкретного случая использования комбинированное условие :id IS NULL OR a.id = NULL
по-прежнему работает в соответствии с назначением PostgreSQL. Но в другом контексте вы не получите никаких строк с some_value = NULL
, даже если some_value
равно null. Поэтому я думаю, что для надежного и понятного кода в любом случае следует избегать выражения типа some_value = NULL
.
END EDIT
Возможно, вы столкнулись с проблемой в JPQL с помощью
SELECT a FROM Auftrag a WHERE :id is null OR a.id = COALESCE(:id, -1)
по крайней мере, это возможно с помощью родного Hibernate HQL. В этом случае вторая часть условия WHERE оценивается как FALSE, если :id
имеет значение null, но все условие WHERE оценивается как TRUE, что вам нужно.
Но для запросов динамической фильтрации лучше использовать API-интерфейс JPA 2.0 Criteria и включать параметр :id
в запрос, только если он не является нулевым. Опять же, я не знаю специфики критериев JPA, но с собственными критериями Hibernate это будет
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();
}
Надеюсь, что это поможет.