Необязательные параметры в именованном запросе в EclipseLink

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

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

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

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


person Atul Kumbhar    schedule 11.11.2018    source источник
comment
Это ваш настоящий код? Двойные кавычки и / или правая скобка кажутся неуместными.   -  person mustaccio    schedule 12.11.2018
comment
Это была опечатка. Спасибо   -  person Atul Kumbhar    schedule 12.11.2018
comment
Это похоже на исключение БД - какой SQL создается? Вам нужно будет проверить документы своей базы данных, чтобы узнать, поддерживается ли column = null, или если это null, это null, что ему не нравится.   -  person Chris    schedule 13.11.2018
comment
Это мой именованный запрос: SELECT o FROM ORDER o WHERE (o.quoteNumber =: quoteNumber) OR (: quoteNumber IS NULL)), и он генерирует один: SELECT * FROM ORDER o WHERE (o.quoteNumber = NULL) OR (NULL НУЛЕВОЙ))   -  person Atul Kumbhar    schedule 14.11.2018
comment
Ожидаете ли вы какой-либо динамической настройки именованного запроса (нулевой параметр не является частью предложения where)?   -  person briadeus    schedule 15.11.2018
comment
Я ожидаю пропустить предложение во время выполнения, если переданное значение quoteNumber равно null   -  person Atul Kumbhar    schedule 16.11.2018


Ответы (1)


В спецификации JPA говорится, что

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

Таким образом, вы не можете ожидать, что они изменятся во время выполнения на основе какого-либо нулевого условия. Criteria 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) = ''

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

person briadeus    schedule 17.11.2018
comment
Спасибо за Ваш ответ. Вы имеете в виду, что ответ, предоставленный здесь, неверен? - person Atul Kumbhar; 19.11.2018
comment
Добро пожаловать, я обновил свой ответ на основе вашего комментария. - person briadeus; 19.11.2018