【发布时间】:2021-01-06 07:11:09
【问题描述】:
我有一个查询,我需要先检查输入参数是否为空或比较列值以传递输入参数。表示列值可以为null或通过指定条件(?3为null或cd.name like %?3%)。
public interface PageableCategoryRepository extends PagingAndSortingRepository<Category, Long> {
@Query(
value = "select distinct c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm"
+ " where cm.id=?1 and cdl.id=?2 and (?3 is null or cd.name like %?3%) order by c.lineage, c.sortOrder asc",
countQuery = "select count(c) from Category c join c.descriptions cd join c.merchantStore cm "
+ "where cm.id=?1 and cd.language.id=?2 and (?3 is null or cd.name like %?3%)")
Page<Category> listByStore(Integer storeId, Integer languageId, String name, Pageable pageable);
}
对于 name 属性中传递的空值,上述查询失败。 错误:
错误:运算符不存在:字符变化 ~~ bytea 提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。 位置:3259
我尝试在 Google 和 Stack Overflow 上搜索。有许多类似的问题被问和回答。但这些解决方案都不适合我。
如果有人能提供一些见解或方向,将不胜感激。
注意:Spring boot 版本 - 2.2.7.RELEASE,使用的 Postgresql 库版本 - 42.2.16,使用的 Postgresql 版本 - 12.4
【问题讨论】:
-
很确定问题出在
cd.name like %?3%,因为LIKE解析为~~。所以发生错误是因为cd.name我假设是一个varchar 正在通过~~与Postgres 认为是bytea类型的东西进行比较。换句话说,当String name为空时,正在对%?3%执行某些操作以使其显示为bytea。 -
name是否等于 null? -
传递给过滤结果的名称可能为空。
-
但是不为null的时候是否有效?
-
是的,它确实有效。
标签: java postgresql spring-boot nativequery