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

Hibernate使用@Formula注解查询引用实体属性值报错如何解决

错误产生原因

  • @Formula 注解内的语句是直接在数据库层面执行的原生SQL,只能识别数据库实际列名,不识别Java实体类的属性名。你代码里A实体的aId属性对应的数据库a表主键列名为id(通过@Column(name = "id")指定),直接在@Formula中写实体属性名aId不符合语法规则。
  • Hibernate解析@Formula内容时,会默认将未加表前缀的字段识别为当前实体对应表的列,自动拼接表别名后就生成了错误日志中的a0_.aId,但a表本身不存在aId字段,因此抛出未知列异常。

解决方案

直接修改@Formula中的查询语句,将引用的aId替换为a表的实际主键列名id即可,修改后的代码如下:

@Entity
@Table(name = "a")
class A {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id", updatable = false, nullable = false)
  private int aId;

  @Column(name = "title")
  private String title;

  @Formula("(SELECT COUNT(*) FROM b WHERE b.a_id = id)")
  private Integer count;
}

如果要避免多表查询时的列名冲突,也可以使用Hibernate提供的{alias}占位符指代当前实体表的别名,写法更稳妥:

@Formula("(SELECT COUNT(*) FROM b WHERE b.a_id = {alias}.id)")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:45:04