【发布时间】:2021-05-02 02:03:35
【问题描述】:
我正在使用 Hibernate 从 Postgresql DB 获取数据,但在尝试将 EMPTY 或 NULL 作为 Long 值列表传递给查询时总是出现此错误:
@Repository
public interface ProductRepository extends JpaRepository<Category, Long> {
@Query(nativeQuery = true,
value = "SELECT * FROM Products p " +
"WHERE (COALESCE(:#{#param.colors}) IS NULL OR p.color IN (:#{#param.colors}))")
List<Product> findFiltered(@Param("param") ProductFilterParams params);
}
(注意:由于请求复杂,我使用原生查询)
ProductFilterParams 看起来像:
@Data
public class ProductFilterParams {
private List<Long> colors;
...other product filters...
}
所以想法是按颜色过滤产品(效果很好)或显示所有产品,如果没有颜色过滤器(这里我得到这个错误)。
当我将 null 作为颜色日志传递时:
绑定参数 [1] 为 [LONGVARCHAR] - [null]
错误:运算符不存在:bigint = 字符变化
或者当我尝试传递空列表时:
*** 完全没有绑定日志 ***
错误:“)”处或附近的语法错误
我不知道为什么会出现这个错误以及如何解决它。 我尝试了一些来自 web/stackoverflow 的谷歌搜索答案,但它们都是针对 HQL 的,并且无法针对本机查询进行修复。
【问题讨论】:
-
您是要合并 OR 语句还是仅合并列表?
-
@RogerLindsjö OR 声明。事实上我还有很多其他的产品过滤器,所以查询看起来像:
where (:a is null or column_a in (:a)) and (:b is null or column_b in (:b) and ...) -
我误读了括号(太早了)。
-
@RogerLindsjö np
-
@koigor 您在本专栏中使用什么 postgresql 类型?
标签: java postgresql spring-boot hibernate hibernate-native-query