在实际开发中,删除操作往往通过修改状态码来实现软删除,以保留历史数据。但jpa中提供的delete方法是直接删除该记录,与需求不符,很难直接使用。如果使用状态码的话,删除需要先查询,再改状态最后调用save方法,查询也需要加上状态码,使用起来比较繁琐。
对于这种需求,我们可以通过jpa提供的@Where
与@SQLDelete
两个注解来实现:
通过@Where
注解,可以给所有通过jpa生成的查询语句拼接一段自定义sql。
通过@SQLDelete
注解,可以替换jpa默认的delete的实现sql。
如果我们需要实现逻辑删除,那么就应该实现以下功能:
- 修改删除语句,通过status字段进行删除。
- 在查询时带上状态码进行查询。
假设我们定义status为状态码,1为正常,2为删除,那么实体类上面可以加上如下注解:
例如实体Book
@Data
@Table("book")
@SQLDelete(sql = "update book set status = 0 where id = ?")
@Where(clause = "status != 0")
public class Book {
@Id
@Column(name = "id")
private int id;
@Column(name = "name")
private String name;
@Column(name = "desc")
private String desc;
@Column(name = "type")
private Integer type;
//1:有效 0:无效
@Column(name = "status")
private Integer status;
}