#spring #postgresql #spring-boot #spring-data-jpa
#spring #postgresql #весенняя загрузка #spring-data-jpa
Вопрос:
У меня есть модель категории продукта N-N, и я сделал запрос Spring Data JPA @ для извлечения продуктов данной категории (или всех продуктов, если категория равна нулю):
@Query("SELECT DISTINCT obj FROM Product obj INNER JOIN obj.categories cats WHERE "
"(:category IS NULL OR :category IN cats)")
Page<Product> find(Category category, Pageable pageable);
Он отлично работает в базе данных H2. Однако при тестировании в Postgres 12, если задана нулевая категория, я получаю следующую ошибку:
org.postgresql.util.PSQLException: ERROR: operator does not exist: bytea = bigint
Hint: No operator matches the given name and argument types. You might need to add explicit type casts.
В прошлом Coalesce однажды спас меня от подобной проблемы с параметром типа Instant, но на этот раз это НЕ решило проблему для параметра сущности:
"(COALESCE(:category, NULL) IS NULL OR :category IN cats)")
На всякий случай я протестировал только для NULL, и он не выдает никаких ошибок как для категорий null, так и not null:
"(:category IS NULL")
Я также протестировал только предложение IN и получил ту же ошибку «оператор не существует», когда задана нулевая категория:
"(:category IN cats)")
Тесты показали, что, по-видимому, :category IS NULL
условие перед оператором OR не препятствует :category IN cats
вычислению. Как я могу решить эту проблему?
Комментарии:
1. Эй, Нелио, ты нашел какое-нибудь решение для этого? Я сталкиваюсь с той же проблемой
Ответ №1:
Столкнувшись с той же проблемой, что и вы, и попробовав несколько разных решений, я нашел то, которое отлично работает с PostgreSQL.
Вместо передачи списка как null вы можете передать список как emptyList()
Поэтому я добавляю троичный в свой код, чтобы проверить, равен ли параметр null, если это так, я передаю Collections.emptyList();
Надеюсь, это вам тоже поможет 🙂
Комментарии:
1. Ты спаситель жизни!! Простой и понятный. Спасибо, чувак