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

Spring Boot嵌入式复合键搭配H2报错:字段存在却提示未找到

问题原因

你给amount字段同时标注了@Formula和@Column注解,这两个注解在Hibernate中存在冲突:

  • @Formula用于定义虚拟计算列,Hibernate会判定该字段无需在数据库创建物理列,仅通过SQL表达式实时计算取值
  • @Column则指示Hibernate要在数据库表中生成对应的物理字段

两者叠加后,Hibernate会优先遵循@Formula的规则,不会在CAR表中生成AMOUNT物理列,但查询时又会尝试读取这个不存在的列,最终触发列找不到的错误。

解决办法

根据业务需求选择以下两种方案之一:

方案1:需要在数据库中存储AMOUNT字段

  • 删除@Formula注解,保留@Column(name = "AMOUNT")
  • 若需实现amount / 100的转换逻辑,可在实体类中新增一个只读的瞬态属性处理:
@Column(name = "AMOUNT")
private Double amount;

// 计算后的值,不映射到数据库列
@Transient
public Double getCalculatedAmount() {
    return this.amount != null ? this.amount / 100 : null;
}

方案2:无需存储,仅需实时计算amount值

  • 删除@Column注解,保留@Formula
  • 注意@Formula中的SQL表达式要对应数据库中实际存在的列名,例如数据库存储原始金额的列是RAW_AMOUNT,则表达式应改为:
@Formula("RAW_AMOUNT / 100")
private Double amount;
  • 此时amount字段为只读状态,无法通过实体类更新其值

额外提示:嵌入式主键CarEntityId中包含@ManyToOne关联,虽然Hibernate支持这种写法,但通常建议将关联关系放在主实体类中,避免后续关联查询出现异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:57:29