java - 如何处理 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
。并将其注入到DefaultDataAccessStrategy
via aSqlGeneratorSource
中。由于SqlGenerator
仅包可见,因此您必须为此创建自己的DefaultDataAccessStrategy
,基本上复制现有的。当然,这将带来维护它的长期成本。由于您的场景似乎只需要非常特殊的 SpEL 支持实体名称,为此打开一个问题并提交拉取请求可能是一个可行的选择。如果您对此方法感兴趣并需要更多帮助,请在问题描述中提及。
推荐阅读
- java - 如何捕获亚马逊产品 selenium 的 xpath
- python - Django pyodbc 支持 Nexus DB 还是依赖于数据库?
- html - 我怎样才能使间距相等?
- sql - 我想在从 oracle 中选择时格式化电话号码列
- c# - 如何使用 LINQ 在字符串的一部分上创建组?
- machine-learning - ML.NET 预测客户订单数量
- python-3.x - Pytorch:相同输入的向量乘法结果不同
- flutter - 从颤动的共享首选项中读取字符串
- angular - 如果用户未登录,则阻止页面呈现
- javascript - 使用扩展减少 es6 缺少的对象嵌套数组