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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:47:17