其他分享
首页 > 其他分享> > 如何在Spring Data JDBC中处理软删除?

如何在Spring Data JDBC中处理软删除?

作者:互联网

有没有一种很好的方法来处理Spring Data JDBC中的软删除?

在Spring Data JPA中,我们可以添加@Where(clause =“is_active = 1”)注释或扩展CrudRepository或PagingAndSortingRepository.

由于Spring Data JDBC在查询中不支持SPEL,因此我们无法以通用方式编写它们,如下所示:

@NoRepositoryBean
public interface SoftDeleteCrudRepository<T extends BasicEntity, ID extends 
Long> extends CrudRepository<T, ID> {
//Override CrudRepository or PagingAndSortingRepository's query method:
@Override
@Transactional(readOnly = true)
@Query("select e from #{#entityName} e where e.deleteFlag=false")
public List<T> findAll();

//Look up deleted entities
@Query("select e from #{#entityName} e where e.deleteFlag=true")
@Transactional(readOnly = true)
public List<T> findAllDeleted(); 

//Soft delete.
@Query("update #{#entityName} e set e.deleteFlag=true where e.id=?1")
@Transactional
@Modifying
public void softDelete(String id);
...
}

因此,扩展CrudRepository或PagingAndSortingRepository意味着为每个实体/表的每个存储库编写相同的查询?喜欢

Repository1
@Override
@Transactional(readOnly = true)
@Query("select id, name, value, deleteFlag from table1 e where e.deleteFlag=false")
public List<T> findAll();
....

Repository2
@Override
@Transactional(readOnly = true)
@Query("select id, name, value, deleteFlag from table2 e where e.deleteFlag=false")
public List<T> findAll();
....

感谢您提前回复!

解决方法:

我目前看到三个选项如何实现这一目标.

>使用视图.对于每个聚合根,创建一个数据库视图,用于筛选出软删除的行.根据这些视图映射您的实体.
>编写自己的SqlGenerator.并通过SqlGeneratorSource将其注入DefaultDataAccessStrategy.由于SqlGenerator只是包可见,因此您必须为此创建自己的DefaultDataAccessStrategy,基本上复制现有的版本.当然,这将带来维持它的长期成本.
>由于您的场景似乎需要的是对实体名称的非常​​特殊的SpEL支持,为此提出问题并提交拉取请求可能是一个可行的选择.如果您对此方法感兴趣并需要更多帮助,请在问题说明中提及它.

标签:java,spring-data,spring-data-jdbc
来源: https://codeday.me/bug/20190701/1345814.html