Необязательные параметры в именованном запросе в EclipseLink - PullRequest
0 голосов
/ 12 ноября 2018

Я новичок в именованных запросах JPA, использующих EclipseLink, и я хочу "игнорировать" свойства с нулевыми значениями в именованном запросе. Я знаю, что на мой вопрос ответили много раз. например JPA-запрос для обработки значения параметра NULL

Однако в моем случае следующий формат не работает

+ " AND (:quoteNumber IS NULL OR ord.quoteNumber = :quoteNumber)"

Я получаю сообщение об ошибке "НЕЗАКОННОЕ ИСПОЛЬЗОВАНИЕ КЛЮЧЕВОГО СЛОВА". Я буду использовать CriteriaQuery сейчас и просто любопытно, почему он не работает в именованном запросе. Ниже приведены используемые версии DB2 и Eclipselink. eclipselink: 2.5.1 DB2: DSN11015

1 Ответ

0 голосов
/ 17 ноября 2018

В спецификации JPA указано, что

3.8.13 Именованные запросы
Именованные запросы: статические запросы , выраженные в метаданных. Именованные запросы могут быть определены на языке запросов Java Persistence или в SQL. Имена запросов относятся к единице сохранения.

Таким образом, вы не можете ожидать, что они изменятся во время выполнения в зависимости от какого-либо нулевого условия. Критерии Query, как вы указываете, по своей природе динамичен, так что будет лучше.

РЕДАКТИРОВАТЬ на основе комментария:

 AND (ord.quoteNumber = :quoteNumber or :quoteNumber is null or :quoteNumber = '' 

не изменяет запрос во время выполнения (не пропускает предложение). Это оценивает предложение как ИСТИНА. Проблема с DB2 (и насколько я знаю, с Derby) состоит в том, что они не позволяют "нетипизированному Null отправляться на сервер" согласно API PreparedStatement.setObject, Вы можете проверить это, установив тип с помощью приведения

 AND (ord.quoteNumber = cast(:dfdTxt as integer) or cast(:dfdTxt as integer) is null or cast(:dfdTxt as integer) = ''

Таким образом, этот подход специфичен для реализации БД и может измениться в какой-то момент.

...