Postgres и Spring Data JPA: оператор не существует: bytea = bigint

#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. Ты спаситель жизни!! Простой и понятный. Спасибо, чувак