Я не знаю ни специфики JPQL, ни того, как Oracle обрабатывает условие WHERE вашего запроса.Но я бы поспорил, что вторая часть вашего условия WHERE не полностью игнорируется и что a.id = NULL
вызывает проблему.Помимо явно несовместимых типов данных условие, подобное some_value = NULL
, может оцениваться не в ИСТИНА или ЛОЖЬ, а в ПУСТО (по крайней мере, это происходит в PostgreSQL).Для вашего конкретного случая использования объединенное условие :id IS NULL OR a.id = NULL
по-прежнему работает так, как задумано в PostgreSQL.Но в другом контексте вы не получите строк с some_value = NULL
, даже если some_value
равно нулю.Поэтому я считаю, что ради надежного и понятного кода в любом случае следует избегать выражения типа 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 и включать в запрос параметр :id
, только если он не равен нулю.Опять же, я не знаю особенностей JPA Criteria, но с родными Hibernate Criteria это будет
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();
}
Надеюсь, что это поможет.