有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JPA规范:筛选子实体

我成功地为我的应用程序的实体实现了软删除(也称为删除标志)。然而,我还有一个问题。 我已经用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));
        }
    };

例如,如果该实体有一个也被软删除的实体的OneToMany子列表,则不会筛选该列表,因为查询不是由其存储库运行的

我的问题:我是否可以修改上述规范,以便过滤掉软删除的子项? 另一种方法是使用反射(在查询后手动)过滤child,但这不会起作用


共 (2) 个答案

  1. # 1 楼答案

    使用Hibernate,您可以在实体上使用@Where注释

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

    也就是说,看一下@SQLDelete以获得软删除实现的替代方案

  2. # 2 楼答案

    我让它工作了。如果每个产品都有一个子实体类别,即类别是产品的子实体,则以下代码适用于我

    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);
    }