Hibernate 如何在Spring数据的findAll()方法中过滤软删除项?

Hibernate 如何在Spring数据的findAll()方法中过滤软删除项?,hibernate,spring-data,spring-data-jpa,Hibernate,Spring Data,Spring Data Jpa,最近我了解到有@Where注释,我可以在@Entity类上成功地使用它。看起来此筛选器将应用于每个查询。 当我试图将这个软删除实体作为另一个@entity中的集合元素时,我遇到了这个问题 无法通过引用链找到id为xx的SoftDeleteIdentity 现在我只想在SpringDataRepo的findAll方法上使用这个@Where过滤器。我尝试了以下方法,但无效 public interface MyEntity extends JpaRepository<MyEntity,

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

无法通过引用链找到id为xx的SoftDeleteIdentity

现在我只想在SpringDataRepo的findAll方法上使用这个@Where过滤器。我尝试了以下方法,但无效

    public interface MyEntity extends JpaRepository<MyEntity, Long> {

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

有可能吗

如果您使用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.

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

如果使用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.

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

我不这么认为。要使用Querydsl,请直接在name方法中使用它,类似这样的内容:findallbysideletedfalse->See:@Whereclause=is\u deleted='false'与findallbydisdeletedfalsist findbyideletedfalse相同;应该在Spring数据中工作JPAI不这么认为。要使用Querydsl,请直接在name方法中使用它,类似这样的内容:findallbysideletedfalse->See:@Whereclause=is\u deleted='false'与findallbydisdeletedfalsist findbyideletedfalse相同;应该在SpringDataJPAIF中工作如果您的所有对象都必须具有软删除功能,这是可以的,但是如果您只想对单个对象使用这种软删除功能呢?其他的只是从数据库中删除。然后答案是Pau的评论:FindAllBysDeletedFalse在对象的DAO中。有没有人因为使用PagingAndSortingRepository这种检索页面数据的方法而面临JpaObjectRetrievalFailureException?如果所有对象都必须具有软删除功能,这是可以的,但是如果您只希望一个对象具有这种软删除功能呢?其他的只是从数据库中删除。然后答案是Pau的评论:FindAllBysDeletedFalse在对象的DAO中。是否有人使用PagingAndSortingRepository这种检索页面数据的方式面临JpaObjectRetrievalFailureException?