Java JPA规范:筛选子实体
我成功地为我的应用程序的实体实现了软删除(也称为删除标志)。然而,我还有一个问题。 我已经用findAll和count方法编写了一个定制的JPARepository,它可以过滤掉被删除的JPARepository。我按照规范执行此操作:Java JPA规范:筛选子实体,java,hibernate,jpa,soft-delete,Java,Hibernate,Jpa,Soft Delete,我成功地为我的应用程序的实体实现了软删除(也称为删除标志)。然而,我还有一个问题。 我已经用findAll和count方法编写了一个定制的JPARepository,它可以过滤掉被删除的JPARepository。我按照规范执行此操作: softDeleteSpecification = new Specification<T>() { @Override public Predicate toPredicate(Root<T> root,
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));
}
};
softDeleteSpecification=新规范(){
@凌驾
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder cb){
返回cb.or(cb.isNull(root.get(DELETED_字段_名称)),cb.equal(root.get(DELETED_字段_名称)),false);
}
};
例如,如果该实体有一个也被软删除的实体的OneToMany子列表,则不会筛选该列表,因为查询不是由其存储库运行的
我的问题:我是否可以修改上述规范,以便过滤掉软删除的子项?
另一种方法是使用反射(在查询后手动)过滤child,但这不会执行。使用Hibernate,您可以在实体上使用
@Where
注释
@Entity
@Where(clause = "deleted = 0")
public class MyEntity {
...
也就是说,看看
@SQLDelete
,可以找到实现软删除的替代方案。我成功了。如果每个产品都有一个子实体类别,即类别是产品的子实体,则以下代码适用于我
public static Specification<Product> whereCategoryNameEquals(@NonNull String categoryName) {
return (Root<Product> root, CriteriaQuery<?> query, CriteriaBuilder cb)
-> cb.equal(root.get(Product_.CATEGORY).get(Category_.CATEGORY_NAME),categoryName);
}
公共静态规范,其中categoryName等于(@NonNull String categoryName){
返回(根目录、CriteriaQuery查询、CriteriaBuilder cb)
->cb.equal(root.get(Product.CATEGORY).get(CATEGORY.CATEGORY\u NAME),categoryName);
}
我们已经试过了。额外的where子句被添加到对实体本身执行的查询中,即对具有急切抓取的父级执行的查询,而不是具有惰性抓取的查询。另一方面:我们试图避免使用特定于Hybernate的命令,因为我们不需要任何直接依赖关系。这就是为什么我构建了一个自定义的软删除解决方案,而不是使用where子句。where子句是个好主意。