Spring Boot3+Hibernate6中@JoinFormula固定值关联报错修复咨询
Spring Boot 3 + Hibernate 6 关联查询报错修复方案
报错根源
Hibernate 6 对@JoinColumnOrFormula和@JoinFormula的解析逻辑与 Hibernate 5 存在差异。当你在原生查询findMostRecentAttachment中使用带固定值codCategory='AF'的关联配置时,Hibernate 6 会强制要求原生查询结果集中包含codCategory列,但你的查询并未返回该列,因此触发"Unable to find column position by name: codCategory"错误。
可行修复方案(保留attachmentType字段兼容遗留代码)
方案1:将固定条件移至@Where注解(最优解)
把关联条件中的固定值判断从@JoinFormula剥离,改用@Where注解绑定到AttachmentTypeEntity的关联上,避免Hibernate依赖查询结果中的codCategory列:
@Entity public class Attachment { // 其他实体字段... @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TYPE", referencedColumnName = "codType") @Where(clause = "codCategory = 'AF'") private AttachmentTypeEntity attachmentType; // getter/setter 方法 }
此方案完全符合Hibernate 6的规范,无需修改原生查询代码,同时保留attachmentType字段的原有使用逻辑。
方案2:修改原生查询,显式返回codCategory列
如果无法调整实体类注解,可在原生查询中强制返回codCategory列(即使业务逻辑不需要),让Hibernate能找到对应列的位置:
SELECT a.*, ate.codCategory FROM ATTACHMENT a LEFT JOIN ATTACHMENT_TYPE_ENTITY ate ON a.TYPE = ate.codType AND ate.codCategory = 'AF' -- 原查询的筛选、排序逻辑
方案3:用@Formula自定义关联查询
若上述方案不适用,可通过@Formula直接编写关联SQL,绕过Hibernate 6对@JoinColumnOrFormula的解析限制:
@Entity public class Attachment { // 其他实体字段... @ManyToOne(fetch = FetchType.LAZY) @Formula("(SELECT ate.id FROM ATTACHMENT_TYPE_ENTITY ate WHERE ate.codType = TYPE AND ate.codCategory = 'AF')") private AttachmentTypeEntity attachmentType; // getter/setter 方法 }
注意:@Formula中的SQL需适配你使用的数据库语法。
内容的提问来源于stack exchange,提问作者Alessandro Briggi
相关产品推荐
相关产品推荐

