You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迁移至Hibernate 6后DATE_PART函数失效问题咨询

问题:Hibernate 6迁移后DATE_PART函数调用报错

需求背景

需计算两个日期字段的差值天数并与指定值比较,因查询条件数量可变,采用JPA Specification实现而非原生查询。

原原生查询语句

select
    *
from
    transaction transactio0_ 
where
    transactio0_.order_status=? 
    and (
        transactio0_.date_start between ? and ?
    ) 
    or DATE_PART(?,transactio0_.date_end-transactio0_.date_start)=100.0;

Specification实现代码

spec = spec.and((root, query, builder) -> {
                return builder.equal(
                        builder.function("DATE_PART", Double.class, builder.literal("day"),
                                builder.diff(endDate,startDate )),
                        filter.orderPendingDays());
            });

迁移前后生成的SQL对比

  • Hibernate 5生成的SQL:
    DATE_PART('day',transactio0_.date_end-transactio0_.date_start)
    
  • Hibernate 6生成的SQL:
    DATE_PART('day',extract(epoch from t1_0.date_end-t1_0.date_start)*1e9)
    

报错信息

Caused by: org.postgresql.util.PSQLException: ERROR: function date_part(unknown, double precision) does not exist

问题原因

  1. Hibernate版本间日期差值类型处理差异
    在Hibernate 5中,两个日期字段直接相减(date_end - date_start)会被解析为PostgreSQL支持的interval类型,而PostgreSQL的DATE_PART('day', interval)是合法调用——DATE_PART函数原生支持interval类型作为第二个参数。

  2. Hibernate 6的日期差值转换逻辑变更
    Hibernate 6不再保留日期相减的interval类型,而是将其转换为毫秒级的浮点数(double precision类型):通过extract(epoch from ...)获取秒数后乘以1e9得到毫秒数。但PostgreSQL的DATE_PART函数没有接受double precision类型参数的重载版本,因此触发"函数不存在"的错误。

  3. 类型不匹配导致函数解析失败
    PostgreSQL解析DATE_PART('day', double_value)时,无法找到匹配的函数签名,因为DATE_PART的第二个参数预期是timestamp、interval等日期/时间相关类型,而非数值类型。

内容的提问来源于stack exchange,提问作者Naveen Varghese

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 22:57:07