在实际开发中,删除操作往往通过修改状态码来实现软删除,以保留历史数据。但jpa中提供的delete方法是直接删除该记录,与需求不符,很难直接使用。如果使用状态码的话,删除需要先查询,再改状态最后调用save方法,查询也需要加上状态码,使用起来比较繁琐。
对于这种需求,我们可以通过jpa提供的@Where@SQLDelete两个注解来实现:
通过@Where注解,可以给所有通过jpa生成的查询语句拼接一段自定义sql。
通过@SQLDelete注解,可以替换jpa默认的delete的实现sql。

如果我们需要实现逻辑删除,那么就应该实现以下功能:

  1. 修改删除语句,通过status字段进行删除。
  2. 在查询时带上状态码进行查询。

假设我们定义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;
}

Q.E.D.