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,兼容性更好:
- 定义结果集映射(可放在任意实体类或单独的
@Entity标注类中):
@SqlResultSetMapping( name = "SomeJsonResultMapping", classes = @ConstructorResult( targetClass = SomeJsonResult.class, columns = { @ColumnResult(name = "id", type = Long.class), // 指定jsonColumn的映射类型 @ColumnResult(name = "jsonColumn", type = TestTabel.SomeJson.class) } ) )
- 执行原生查询时指定映射名称:
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):
- 添加Maven依赖:
<dependency> <groupId>com.vladmihalcea</groupId> <artifactId>hibernate-types-60</artifactId> <version>2.21.1</version> </dependency>
- 修改代码中的类型引用(注意包名变化):
import com.vladmihalcea.hibernate.type.json.JsonBinaryType; // ... .addScalar("jsonColumn", new JsonBinaryType(TestTabel.SomeJson.class))
内容的提问来源于stack exchange,提问作者Mihai Catalin Valentin
相关产品推荐
相关产品推荐

