jpa实现根据条件删除_spring data jpa 实现逻辑删除

由于最近正在做一个开源的微服务系统。采用spring cloud, spring boot, axon 等等来做。然后呢。ORM打算采用的是spring data jpa。然后再做系统的时候就考虑到了一个持久化逻辑删除的问题。那么问题来了。spring data jpa并不支持逻辑删除。在网上找了很多以后。发现有个同学是这样做的。自己写一个BaseDao然后BaseDao继承PagingAndSortingRepository 这个类。再自己对BaseDao写一个实现。把SimpleJpaRepository 代码复制过来。再将里面的查询语句进行修改。同时实现逻辑删除的代码。原文链接如下。

感兴趣的同学可以去自行研究一下。刚开始我也觉得。这就是我想要的。但是写了之后。一直报错。找不到自定义的那几个逻辑删除属性。原来是自己写的实现没有生效。这让我很忧伤啊。然后继续逛,看到一个这样的方案。

@Entity

@Table(name="demo")

@SQLDelete(sql = "update demo set deleted = 1 where id = ?")

@Where(clause = "deleted = 0")

public class Demo{

@javax.persistence.Id

@GeneratedValue(strategy = GenerationType.AUTO)

private Long id;

@Column(name="deleted")

private Integer deleted = 0;

private String userName;

@Override

public Long getId() {

return id;

}

@Override

public void setId(Long id) {

this.id = id;

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public Integer getDeleted() {

return deleted;

}

public void setDeleted(Integer deleted) {

this.deleted = deleted;

}

}

作者:scipio

链接:http://www.jianshu.com/p/398b2fda1bb0

來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这玩意儿乍一看很美好。但是实际不然。这样做将所有的删除方法都覆盖了。当我想要用到物理删除的时候。就不能用了。于是再次出发。寻找一种更加美妙的解决方案。终于让我找到了。话不多说。直接放码。

@NoRepositoryBean

public interface BaseDao extends PagingAndSortingRepository {

@Override

@Transactional(readOnly = true)

@Query("select e from #{#entityName} e where e.deleted = false")

List findAll();

@Override

@Transactional(readOnly = true)

@Query("select e from #{#entityName} e where e.id in ?1 and e.deleted = false")

Iterable findAll(Iterable ids);

@Override

@Transactional(readOnly = true)

@Query("select e from #{#entityName} e where e.id = ?1 and e.deleted = false")

T findOne(ID id);

@Override

@Transactional(readOnly = true)

@Query("select count(e) from #{#entityName} e where e.deleted = false")

long count();

@Override

@Transactional(readOnly = true)

default boolean exists(ID id) {

return findOne(id) != null;

}

@Query("update #{#entityName} e set e.deleted = true where e.id = ?1")

@Transactional

@Modifying

void logicDelete(ID id);

@Transactional

default void logicDelete(T entity) {

logicDelete((ID) entity.getId());

}

@Transactional

default void logicDelete(Iterable extends T> entities) {

entities.forEach(entity -> logicDelete((ID) entity.getId()));

}

@Query("update #{#entityName} e set e.deleted = true ")

@Transactional

@Modifying

void logicDeleteAll();

}

BaseEntry代码如下:

@Data

@MappedSuperclass

public class BaseEntry implements Serializable {

private static final long serialVersionUID = 5966306766659220492L;

@Id

protected String id;

@Temporal(TemporalType.TIMESTAMP)

protected Date createdDate;

protected String createdBy;

@Temporal(TemporalType.TIMESTAMP)

protected Date updatedDate;

protected String updatedBy;

protected Boolean deleted = false;

}

这样一来。代码就瞬间清爽了。哈哈~


版权声明:本文为weixin_32579395原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。