Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA规范:筛选子实体_Java_Hibernate_Jpa_Soft Delete - Fatal编程技术网

Java JPA规范:筛选子实体

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,

我成功地为我的应用程序的实体实现了软删除(也称为删除标志)。然而,我还有一个问题。 我已经用findAll和count方法编写了一个定制的JPARepository,它可以过滤掉被删除的JPARepository。我按照规范执行此操作:

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子句是个好主意。