一尘不染

使用Spring JPA处理软删除

java spring

我有一个表Stuff定义为…

id, <fields>..., active

活动状态是软删除标志,并且始终为1或0。从长远来看,这可能会取代历史表格。

public interface StuffRepository extends JpaRepository<StuffEntity, Long> {} 

在代码中,我们始终 使用活动记录。有什么方法可以让Spring始终active=1为该存储库生成的查询附加条件?或更理想的情况是允许我扩展用于生成查询的语法?

我知道可以@queues在任何地方创建named ,但是随后我就失去了生成查询的便利。我还想避免使用“活动”方法污染接口。

如果重要的话,我正在使用Hibernate 4.2作为我的JPA实现。


阅读 1257

收藏
2020-03-23

共2个答案

一尘不染

这是一个古老的问题,你可能已经找到了答案。但是,对于所有寻求答案的Spring / JPA / Hibernate程序员来说-

假设你有实体狗:

 @Entity
 public class Dog{

 ......(fields)....        

 @Column(name="is_active")
 private Boolean active;
 }

和一个存储库:

public interface DogRepository extends JpaRepository<Dog, Integer> {
} 

你需要做的就是在实体级别添加@Where批注,结果是:

@Entity
@Where(clause="is_active=1")
public class Dog{

......(fields)....        

@Column(name="is_active")
private Boolean active;
}

存储库执行的所有查询将自动过滤掉“非活动”行。

2020-03-23
一尘不染

@Where(clause="is_active=1") 不是使用spring数据jpa处理软删除的最佳方法。

首先,它仅适用于hibernate工具。

其次,你永远无法使用spring数据获取软删除的实体。

我的解决方案是由spring数据提供的。#{#entityName}可以在通用存储库上使用表示具体实体类型名称的表达式。

和代码将是这样的:

//Override CrudRepository or PagingAndSortingRepository's query method:
@Override
@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")
public List<T> recycleBin(); 

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