gpt4 book ai didi

java - 如何处理 Spring Data JDBC 中的软删除?

转载 作者:搜寻专家 更新时间:2023-11-01 03:15:42 24 4
gpt4 key购买 nike

在 Spring Data JDBC 中是否有处理软删除的好方法?

在 Spring Data JPA 中,我们可以添加 @Where(clause="is_active=1") 注解或扩展 CrudRepositoryPagingAndSortingRepository

由于 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);
...
}

那么扩展 CrudRepositoryPagingAndSortingRepository 意味着为每个实体/表的每个存储库编写相同的查询?喜欢

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();
....

提前感谢您的回复!

最佳答案

我目前看到三个选项可以实现这一目标。

  1. 使用 View 。为每个聚合根创建一个数据库 View ,过滤掉软删除的行。根据这些 View 映射您的实体。

  2. 编写您自己的SqlGenerator。并通过 SqlGeneratorSource 将其注入(inject)到 DefaultDataAccessStrategy 中。由于 SqlGenerator 仅对包可见,因此您必须为此创建自己的 DefaultDataAccessStrategy,基本上复制现有的。当然,这会带来长期的维护成本。

  3. 由于您的方案似乎只需要对实体名称提供非常特殊的 SpEL 支持,为此打开一个问题并提交拉取请求可能是一个可行的选择。如果您对这种方法感兴趣并需要更多帮助,请在问题描述中提及。

关于java - 如何处理 Spring Data JDBC 中的软删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53980307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com