错误:运算符不存在:bigint = 字符因 long

时间:2021-01-28 07:26:07

标签: java postgresql spring-boot hibernate hibernate-native-query

我正在使用 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 的,无法针对本机查询进行修复。

1 个答案:

答案 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_expressioncollection_valued_input_parameter中,值列表不能为空;它必须至少包含一个值。

但是,正如 here 所解释的那样,它在 hibernate 5.4.10 中发生了变化。但是当您使用 hibernate 5.3.7.final 时,您应该在查询之外检查集合是否为空。

顺便说一句,使用带有一个参数的 COALESCE 函数是没有意义的。

相关问题