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

SpringBoot 2迁移至3:Hibernate 6中addScalar映射JSON列到POJO失效问题

SpringBoot 3(Hibernate 6)原生查询映射PostgreSQL jsonb到POJO的解决方案

方法一:使用Hibernate 6内置JsonType替代Hibernate Types

Hibernate 6已原生支持JSON类型处理,无需依赖第三方Hibernate Types库,直接用内置的JsonType即可映射PostgreSQL的jsonb字段:

var sp = dbService.nativeQueryBuilder("select id, json_column as \"jsonColumn\" from test_table")
        .unwrap(NativeQuery.class)
        .addScalar("id", StandardBasicTypes.LONG)
        // 替换为Hibernate 6内置的JsonType,并指定目标JSON映射类
        .addScalar("jsonColumn", JsonType.of(TestTabel.SomeJson.class))
        // Hibernate 6中AliasToBeanResultTransformer需通过create方法实例化
        .setResultTransformer(AliasToBeanResultTransformer.create(SomeJsonResult.class));

return dbService.executeAndReturnListResult(sp, SomeJsonResult.class);

注意事项

  • 确保SomeJson类是可序列化的普通POJO,无需额外注解(若需更精细控制,可在字段上添加@JsonSerialize/@JsonDeserialize)
  • Hibernate 6的PostgreSQLDialect已默认支持jsonb类型,无需额外配置方言

方法二:使用JPA标准@SqlResultSetMapping(推荐,解耦Hibernate API)

通过JPA原生的结果集映射注解,完全避免依赖Hibernate私有API,兼容性更好:

  1. 定义结果集映射(可放在任意实体类或单独的@Entity标注类中):
@SqlResultSetMapping(
        name = "SomeJsonResultMapping",
        classes = @ConstructorResult(
                targetClass = SomeJsonResult.class,
                columns = {
                        @ColumnResult(name = "id", type = Long.class),
                        // 指定jsonColumn的映射类型
                        @ColumnResult(name = "jsonColumn", type = TestTabel.SomeJson.class)
                }
        )
)
  1. 执行原生查询时指定映射名称:
Query query = dbService.getEntityManager().createNativeQuery(
        "select id, json_column as \"jsonColumn\" from test_table",
        "SomeJsonResultMapping"
);
List<SomeJsonResult> results = query.getResultList();

补充配置

若JPA无法自动识别jsonb类型,可在application.properties中添加:

spring.jpa.properties.hibernate.type.preferred_json_type=jsonb

方法三:升级Hibernate Types至兼容Hibernate 6的版本

若坚持使用Hibernate Types,需升级到支持Hibernate 6的版本(如hibernate-types-60):

  1. 添加Maven依赖:
<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-60</artifactId>
    <version>2.21.1</version>
</dependency>
  1. 修改代码中的类型引用(注意包名变化):
import com.vladmihalcea.hibernate.type.json.JsonBinaryType;

// ...

.addScalar("jsonColumn", new JsonBinaryType(TestTabel.SomeJson.class))

内容的提问来源于stack exchange,提问作者Mihai Catalin Valentin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:27:11