Hibernate 6.2 JSON导航功能使用报错求助
解决Hibernate 6.2 JSON属性导航SemanticException问题
要解决这个问题,需要调整实体类的映射方式,让Hibernate将CityInfo识别为可导航的复合聚合类型,而非基本JSON值类型。具体步骤如下:
修改实体映射代码
- 给嵌套类
CityInfo添加@Embeddable注解,标记它为可嵌入的复合类型 - 在
City实体的cityInfo字段上,替换原有的@JdbcTypeCode(SqlTypes.JSON)为@Embedded + @JdbcTypeCode(SqlTypes.JSON)的组合(保留@Column定义以确保数据库字段类型为JSON)
修改后的完整代码:
@Getter @Setter @Table @Entity public class City { @Id @GeneratedValue private int id; private String name; @Embedded @JdbcTypeCode(SqlTypes.JSON) @Column(columnDefinition = "json") private CityInfo cityInfo; @Getter @Setter @Embeddable public static class CityInfo implements Serializable { private String address; private int population; } }
错误原因解释
你之前的映射方式中,单独使用@JdbcTypeCode(SqlTypes.JSON)时,Hibernate会将CityInfo序列化为JSON字符串存储,此时cityInfo在Hibernate元模型中被标记为基本值类型,而非可分解的复合类型。这就导致JPQL查询中无法通过.导航其内部属性,从而抛出SemanticException。
而通过@Embeddable + @Embedded的组合,Hibernate 6.2会将CityInfo识别为JSON格式的复合聚合,允许你在JPQL中直接导航其内部属性,这正是官方文档中提到的特性用法。
验证
修改映射后,你的原查询代码可以正常执行:
TypedQuery<City> query = em.createQuery( "SELECT c FROM City c WHERE c.cityInfo.address = :address", City.class); query.setParameter("address", "test"); System.out.println(query.getResultList());
内容的提问来源于stack exchange,提问作者Sergiy
相关产品推荐
相关产品推荐

