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
相关产品推荐
相关产品推荐

