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
相关产品推荐
相关产品推荐

