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,需要手动指定类型转换逻辑:
- 确保
Social、Friends、Mail类都包含无参构造器(Hibernate反序列化对象的必要条件) - 通过
@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
相关产品推荐
相关产品推荐

