Hibernate使用@Formula注解生成非法别名致SQL无效的解决方法
解决Hibernate 6.0.0中@Formula注解SQL被自动加别名导致的无效请求问题
问题根源
Hibernate 6对@Formula里的SQL做了更严格的解析逻辑,当你写的SQL中的表和当前实体(ApporteurEntity)存在映射关联时,它会自动把表名替换成查询时使用的别名(比如a1_0.affaire)。但你的SQL是直接写的裸表名关联,没有和主查询建立关联逻辑,替换后SQL语义混乱,自然执行失败。
可行解决方案
显式关联主查询,用JOIN语法替代隐式关联
给SQL里的表加别名,并且通过主实体的主键/关联字段和主查询绑定,让Hibernate能正确识别表关系,避免乱替换别名。比如假设ApporteurEntity和affaire表通过apporteur_id关联:@Formula("(SELECT SUM(c.montant) FROM commission c JOIN affaire a ON c.affaire_id = a.id WHERE a.apporteur_id = id)") private BigDecimal totalCommissionsMCourant;这里的
id是ApporteurEntity的主键,Hibernate会自动替换成主查询的别名引用,同时显式JOIN也避免了隐式关联的解析问题。用
{h-sql}标记强制原生SQL不解析
如果你的统计SQL不需要和主查询关联,只是独立计算,直接用Hibernate的原生SQL标记,告诉它不要修改这段SQL:@Formula("{h-sql} (SELECT SUM(commission.montant) FROM commission, affaire)") private BigDecimal totalCommissionsMCourant;这个标记是Hibernate专属语法,加了之后里面的SQL会原样执行,不会被解析替换。
检查实体表名映射配置
确认ApporteurEntity和对应affaire实体的@Table注解表名是否正确,有没有因表名写错导致Hibernate混淆关联关系,错误替换表名。
内容的提问来源于stack exchange,提问作者Pandorque
相关产品推荐
相关产品推荐

