#spring #postgresql #hibernate #spring-data-jpa #shopizer
#spring #postgresql #спящий режим #spring-data-jpa #shopizer
Вопрос:
@Query(value = "select distinct m from MerchantStore m
left join fetch m.parent mp left join fetch m.country mc
left join fetch m.currency mc left join fetch m.zone mz
left join fetch m.defaultLanguage md
left join fetch m.languages mls where (?1 is null or m.storename like %?1%)",
countQuery = "select count(distinct m) from MerchantStore m where (?1 is null or m.storename like %?1%)")
Page<MerchantStore> listAll(String storeName, Pageable pageable);
У меня есть запрос сверху, но он выдает следующее исключение:
PSQLException: ERROR: operator does not exist: character varying ~~ bytea
Hint: No operator matches the given name and argument types. You might need to add explicit type casts.
Когда я поворачиваю условие (m.storename like %?1% or ?1 is null)
, тогда оно работает нормально.
Может ли кто-нибудь объяснить мне, что именно здесь происходит? PS это из библиотеки Shopizer, PageableMerchantRepository.java .
Комментарии:
1. в чем смысл
?1 is null
? например, еслиstoreName = "StarBucks"
у вас будет"starbucks" is null
2. Какой запрос на самом деле отправляется в базу данных?
3. В каком запросе вы меняете условия? И этого не должно быть
m.storename is null
?4. @AlbertoSinigaglia это обычный (если неудачный) короткий путь, используемый программистами, которые не хотят динамически собирать свои запросы. «Если я предоставляю параметр NULL, то это выражение всегда истинно» — это способ игнорировать другую ветвь выражения, не удаляя ее из запроса.
5. @jjanes итак, как мне это исправить? Как правильно это сделать? Это не мой код, и я раньше не использовал Query. Так происходит в каждом отдельном запросе, который они написали, и ни один из них не работает, когда я настраиваю БД.
Ответ №1:
Это может быть потому MerchantStore.storename
, что это ненулевое поле / столбец! 😉
(?1 is null or m.storename like %?1%)
что postgres, очевидно, не нравится (с моими словами: «null не является допустимым «типом данных» для этого столбца»), тогда как в:
(m.storename like %?1% or ?1 is null)
?1 is null
(очевидно!?) никогда не оценивалось.
Итак, сделайте это:
m.storename like %?1%
и убедитесь, что не передается никаких нулей / что с ними делать ( like %null%
или like '%'
?).