使用Spring Data JPA findAll()查询时报Hibernate JDBC值提取异常
问题分析与解决方案
这个问题并非Hibernate兼容性bug,而是类型映射不匹配导致的:
- 实体类中对应PostgreSQL
TIMESTAMP列的字段使用了Instant类型 - Hibernate 6.1.x默认将
Instant映射为带时区的JDBC类型(即InstantAsTimestampWithTimeZoneJdbcType) - 但数据库列是不带时区的
TIMESTAMP,两者类型不兼容,因此抛出"Not supported yet."异常
可行解决方案
1. 调整实体类字段类型
将Instant类型替换为LocalDateTime,该类型与PostgreSQL TIMESTAMP(不带时区)天然匹配:
// 原字段 private Instant createTime; // 修改后 private LocalDateTime createTime;
2. 强制指定字段JDBC类型
若需保留Instant类型,可通过Hibernate注解指定字段使用不带时区的JDBC类型:
import jakarta.persistence.Column; import org.hibernate.annotations.JdbcType; import org.hibernate.type.descriptor.jdbc.TimestampJdbcType; @Column(columnDefinition = "TIMESTAMP") @JdbcType(TimestampJdbcType.class) private Instant createTime;
3. 升级Hibernate版本
Hibernate 6.2.x及后续版本优化了PostgreSQL TIMESTAMP类型的映射逻辑,修复了此类类型匹配问题,升级至最新稳定版(如6.2.x系列)可直接解决问题。
额外提示
PostgreSQL的TIMESTAMP与TIMESTAMPTZ是两种独立类型:
TIMESTAMP:存储本地时间,不带时区信息TIMESTAMPTZ:存储UTC时间,查询时会转换为当前时区时间
若业务需存储UTC时间,建议将数据库列改为TIMESTAMPTZ,这样与Instant类型的映射会更合理,也能避免此类兼容性问题。
内容的提问来源于stack exchange,提问作者Istvan Devai
相关产品推荐
相关产品推荐

