如何在Spring Data的findAll()方法中过滤软删除的项目?

时间:2016-08-09 12:20:31

标签: hibernate spring-data spring-data-jpa

最近我了解到有@Where注释,我可以在我的@Entity课程中成功使用它。看起来此过滤器将应用于每个查询。 当我试图将这个软删除的实体作为另一个@Entity中的集合元素时,我遇到了问题。

  

无法找到id为xx的SoftDeletedEntity(通过引用链...

现在我想尝试仅在SpringData repo的findAll()方法上使用此@Where过滤器。我尝试了以下方法,但它没有用。

    public interface MyEntity extends JpaRepository<MyEntity, Long> {

    @Where(clause = "is_deleted = 'false'")
    @Override
    List<MyEntity> findAll();
}

有可能吗?

1 个答案:

答案 0 :(得分:4)

如果您使用hibernate和@Where,那么您的问题就不容易解决(它被Hibernate过滤,而不是Spring数据)。 但您可以考虑采用另一种方法来使用spring数据的表达式语言进行软删除和查询:

@Override
@Query("select e from #{#entityName} e where e.deleteFlag=false")
public List<T> findAll();

//recycle bin
@Query("select e from #{#entityName} e where e.deleteFlag=true")
public List<T> recycleBin(); 

@Query("update #{#entityName} e set e.deleteFlag=true where e.id=?1")
@Modifying
public void softDelete(String id); 
//#{#entityName} will be substituted by concrete entity name automatically.

像这样重写基础知识库。所有子存储库接口都具有软删除功能。