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

Spring Boot 3.2.7(Java17)迁移时Timestamp字段查询报错求助

问题解决方法

核心原因

Spring Boot 3.2.x搭配的Hibernate 6.x对JPQL的类型校验大幅收紧,now()函数返回的带时区类型(如Instant)无法直接与java.sql.Timestamp(无时区信息)进行比较;同时PostgreSQL的timestamptz(带时区时间戳)与java.sql.Timestamp的映射本身存在时区信息丢失的隐患,升级后触发了类型不匹配的报错。

解决方案

方案1:替换实体类字段类型(推荐)

将实体类中的java.sql.Timestamp替换为java.time.OffsetDateTime,这是JPA 3.0+推荐的、与PostgreSQLtimestamptz精准匹配的类型:

// 修改后的实体类字段
private OffsetDateTime startDate;
private OffsetDateTime endDate;

无需修改数据库表结构,Hibernate会自动完成timestamptz与OffsetDateTime的映射,同时保留时区信息。

方案2:调整JPQL查询语句

如果暂时不想修改实体类,可以在查询中显式指定时间函数的类型,或使用Hibernate 6兼容的时间函数:

@Query("SELECT cn FROM CnEntity cn WHERE cn.isActive = true AND cn.startDate < CAST(current_timestamp AS timestamp) AND cn.endDate > CAST(current_timestamp AS timestamp) ORDER by cn.endDate ASC")

或者直接使用current_timestamp(Hibernate 6会自动匹配对应类型):

@Query("SELECT cn FROM CnEntity cn WHERE cn.isActive = true AND cn.startDate < current_timestamp AND cn.endDate > current_timestamp ORDER by cn.endDate ASC")

额外配置(针对方案1)

如果使用OffsetDateTime,建议在application.properties中指定JDBC时区,避免时区转换异常:

spring.jpa.properties.hibernate.jdbc.time_zone=UTC

可根据业务需求替换为实际时区(如Asia/Shanghai)。

内容的提问来源于stack exchange,提问作者Aniii Ani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 00:49:56