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

Spring+Hibernate+PostgreSQL查询jsonb字段返回对象报错求助

解决Hibernate原生查询jsonb字段返回自定义对象的问题

原因分析

使用原生SQL直接查询返回social(jsonb类型)字段时,Hibernate无法识别该JDBC类型(错误码1111对应jsonb),因为实体类上的@TypeDef配置仅在查询完整实体时生效,原生查询不会自动复用这些类型映射规则。

解决方案

方案1:使用JPQL查询(推荐)

直接通过JPQL从Account实体中筛选social属性,Hibernate会自动复用实体上的@Type(type="jsonb")配置完成类型转换,无需额外处理:

@Query("SELECT a.social FROM Account a WHERE a.number = :number")
Social findSocialByNumber(@Param("number") int number);

方案2:若必须使用原生查询,自定义结果转换

如果业务场景依赖原生SQL,需要手动指定类型转换逻辑:

  1. 确保Social、Friends、Mail类都包含无参构造器(Hibernate反序列化对象的必要条件)
  2. 通过@SqlResultSetMapping指定映射规则:
@Query(value = "select social from accounts where number = :number", nativeQuery = true)
@SqlResultSetMapping(
    name = "SocialMapping",
    classes = @ConstructorResult(
        targetClass = Social.class,
        columns = @ColumnResult(name = "social", type = JsonBinaryType.class)
    )
)
Social findSocialByNumber(@Param("number") int number);

或者在Repository实现类中手动处理结果集:

public Social findSocialByNumber(int number) {
    String sql = "select social from accounts where number = ?";
    return entityManager.createNativeQuery(sql)
        .setParameter(1, number)
        .unwrap(org.hibernate.query.NativeQuery.class)
        .addScalar("social", JsonBinaryType.INSTANCE)
        .uniqueResult();
}

必要检查项

  • 确认项目依赖了对应Hibernate版本的hibernate-types库(如com.vladmihalcea:hibernate-types-52)
  • 确保Social及其内部类的字段名称与数据库jsonb中的键名完全匹配(大小写敏感)
  • 检查PostgreSQL Dialect配置正确,建议使用org.hibernate.dialect.PostgreSQL10Dialect或更高版本

内容的提问来源于stack exchange,提问作者Sergey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:55:32