使用 Spring JPA 处理软删除

2022-08-31 13:41:38

我有一个表定义为...Stuff

id, <fields>..., active

“活动”是软删除标志,始终为 或 。从长远来看,这可能会消失,取而代之的是历史表。10

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

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

我知道我可以在任何地方创建命名,但随后我失去了生成的查询的便利性。我还想避免用“活动”方法污染界面。@queues

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


答案 1

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

首先,它仅适用于休眠实现。

其次,您永远无法获取包含 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); 

答案 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;
}

存储库执行的所有查询都将自动筛选出“非活动”行。


推荐