我正在使用 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 的 googled 答案,但所有答案都是针对 HQL 的,无法针对本机查询进行修复。
答案 0 :(得分:0)
实际上,hibernate 文档says:
<块引用>IN
谓词执行检查特定值是否在值列表中。它的语法是:
in_expression ::= single_valued_expression [NOT] IN single_valued_list
single_valued_list ::= constructor_expression | (subquery) | collection_valued_input_parameter
constructor_expression ::= (expression[, expression]*)
值列表可以来自许多不同的来源。在constructor_expression
和collection_valued_input_parameter
中,值列表不能为空;它必须至少包含一个值。
但是,正如 here 所解释的那样,它在 hibernate 5.4.10 中发生了变化。但是当您使用 hibernate 5.3.7.final 时,您应该在查询之外检查集合是否为空。
顺便说一句,使用带有一个参数的 COALESCE 函数是没有意义的。