2015-01-21 53 views
3

我成功地为我的应用程序的实体实施了软删除(又名删除标志)。但是,我还有一个问题。 我已经用findAll和count方法编写了一个自定义的JPARepository,用于过滤掉已删除的方法。我这样做与规格:JPA规范:筛选子实体

softDeleteSpecification = new Specification<T>() { 
     @Override 
     public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) { 
      return cb.or(cb.isNull(root.get(DELETED_FIELD_NAME)), cb.equal(root.<T>get(DELETED_FIELD_NAME), false)); 
     } 
    }; 

如果实体有例如,它们也软删除实体的一对多子列表,没有被过滤此列表,因为查询不被其运行的仓库。

我的问题:我可以修改上面的规范,以便软删除的孩子被过滤掉吗? 另一种方法是使用反射筛选孩子(在查询后手动筛选),但那不会是高性能的。

回答

0

使用Hibernate,您可以在实体

@Entity 
@Where(clause = "deleted = 0") 
public class MyEntity { 
... 

也就是说使用@Where注解,看看@SQLDelete用于替代你的实现软删除的。

+0

我们已经尝试过。额外的where子句被添加到在实体本身上执行的查询中,查询在父类中通过预先获取执行,而不是使用延迟获取的查询。 附注:我们试图避免Hybernate特定的命令,因为我们不需要任何直接的依赖关系。这就是为什么我建立了一个定制的软删除解决方案,而不是使用where子句。 虽然where子句是个好主意。 – 2015-01-21 12:24:37