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

Hibernate 6.2 JSON导航功能使用报错求助

解决Hibernate 6.2 JSON属性导航SemanticException问题

要解决这个问题,需要调整实体类的映射方式,让Hibernate将CityInfo识别为可导航的复合聚合类型,而非基本JSON值类型。具体步骤如下:

修改实体映射代码

  1. 给嵌套类CityInfo添加@Embeddable注解,标记它为可嵌入的复合类型
  2. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:23:13