Spring Boot 3中@Where注解使用问题:软删除SQL表别名错误修复
修复Hibernate @Where注解生成SQL时表别名错误的问题
问题出在@Where注解的条件写法上,直接写列名会导致Hibernate在生成带别名的SQL时,错误使用原表名而非查询生成的别名。解决方法是在@Where的clause中使用Hibernate提供的{alias}占位符,它会自动替换为当前实体对应的表别名。
修正后的实体代码如下:
@SQLDelete(sql = "UPDATE ExternalReference SET deleted=true, deletedAt=now() WHERE id=?") @Where(clause = "{alias}.deleted = false") public class ExternalReference { // 实体属性、关联映射等代码 }
原因说明
Hibernate在生成查询SQL时会自动给表分配别名(比如示例中的e1_0),当@Where条件中直接写deleted = false时,Hibernate无法正确关联到别名,反而会使用实体对应的数据库原表名。而{alias}是Hibernate的内置占位符,会在SQL生成阶段替换为当前查询的表别名,确保条件指向正确的表引用。
如果你的实体属性和数据库列名不一致(比如实体属性是isDeleted,数据库列是deleted),记得在{alias}后使用数据库列名,或者确保JPA的列映射配置正确,避免出现字段匹配错误。
内容的提问来源于stack exchange,提问作者Burner
相关产品推荐
相关产品推荐

