【问题标题】:ERROR: operator does not exist: bigint = character varying for empty list of long错误:运算符不存在:bigint = 长空列表的字符变化
【发布时间】: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


【解决方案1】:

其实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 所解释的那样,它在休眠 5.4.10 中已更改。但是当您使用 hibernate 5.3.7.final 时,您应该在查询之外检查集合是否为空。

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

【讨论】:

    猜你喜欢
    • 2021-12-09
    • 2021-11-12
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 2018-05-05
    • 2019-07-03
    • 2012-05-19
    相关资源
    最近更新 更多