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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:22:04