Параметр запроса JPA IN или IS NULL - PullRequest
0 голосов
/ 07 апреля 2020

У меня проблема с этим простым запросом:

@Query("SELECT c FROM Cat c WHERE c.id IN (:idCat) OR :idCat IS NULL")
List<Cat> getAllCatWithOrWithoutId(@Param("idCat")List<String> idCat);  

Который запрашивается в списке или, если идентификатор не указан, выберите всех кошек в таблице (idCat на самом деле необязателен). Кажется, работает, когда вместо оператора IN используется оператор «=», но когда я запускаю запрос, у меня появляется сообщение об ошибке: «недопустимый реляционный оператор». Даже если я попробую с нативным запросом. Я пытался заменить значение idCat на одно значение (это работало) или на ноль (это тоже работало), но не тогда, когда я ставил несколько значений.

Это что-то неправильно в синтаксисе или это просто невозможно с В заявлении?

1 Ответ

0 голосов
/ 07 апреля 2020

Когда вы предоставляете заполненный список, ваша вторая часть запроса ( ИЛИ: idCat IS NULL ) преобразуется в список значений для сравнения с " IS NULL ".

Как указано в JSR-338 , глава 4.6.11, " [a] нулевое выражение сравнения проверяет, является ли однозначное выражение пути или входной параметр значением NULL значение", поэтому ожидается, что он не будет поддерживать заполненный список в качестве аргумента. Для проверки списков существует выражение " IS [NOT] EMPTY ", но оно ожидает collection_valued_path_expression , и это не ваш случай.

Я наткнулся иногда со странным поведением некоторых поставщиков персистентности, где они поддерживали (anti-spe c) такое сравнение, если вы заключили параметр в круглые скобки, но, опять же, вы не можете полагаться на него для будущих изменений.

Лучшим подходом в вашем случае будет определение двух разных JPQL или методов для работы с обоими желаемыми сценариями ios.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...