spring - 是否可以在 Spring Data Jpa 的另一个实体中重用规范?

标签 spring spring-data-jpa

鉴于这些实体:

public class Parent {
    private List<Child> children;

    // others fields
}

public class Child {
    private Parent parent;

    // others fields
}

我想应用 Parent 存在的规范, 但带有 Child作为根:

public class ParentSpecs {
    public static Specification<Parent> withComplexFilter(String filter) {
        return (parent, query, criteriaBuilder) -> {
            Predicate predicate;
            // complex algorithm that works, but that I don't want to duplicate
            return predicate;
        };
    }
}

public class ChildSpecs {
    public static Specification<Child> withComplexFilterOnParentField(String filter) {
        return (child, query, criteriaBuilder) -> {
            Path<Object> parent = child.get("parent");
            Root<Parent> root = null; // how to build a root from the "Child" root ?
            return ParentSpecs.withComplexFilter(filter).toPredicate(root, query, criteriaBuilder);
        };
    }
}

是否将规范转换为谓词以在 ChildSpecs 中使用它似乎是一个很好的解决方案?

我们如何使用 Root<Parent>当我们应该使用 Root<Child>

最佳答案

Root 类型基本上是指 SQL 查询的 FROM 部分。要获得另一个根,您需要一个子查询:

return (child, query, criteriaBuilder) -> {
  final Subquery<ReturnType> subquery = query.subquery(ReturnType.class);
  final Root<Parent> subroot = subquery.from(Parent.class);
  subquery.select("parentField");
  // call shared code
  return criteriaBuilder.equal(subquery, child.get("something"));
}

这基本上类似于下面的 SQL:

SELECT ... FROM child c WHERE c.something = (
  SELECT parentField FROM parent WHERE (...shared conditions...)
);

关于spring - 是否可以在 Spring Data Jpa 的另一个实体中重用规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59968595/

相关文章:

java - 触发浏览器PDF下载 Spring MVC

spring - Spring-fu-Kofu:无法连线 `NamedParameterJdbcTemplate`

Spring jdbc、jndi 还是独立的tomcat jdbc 连接池?

java - 当使用Keycloak进行POST请求时,Spring Boot返回403被禁止

java - 如何使用 Spring Data JPA 访问 Azure AD 集成的 Postgres DB?

mysql - 由 : org. hibernate.MappingException : property mapping has wrong number of columns: com. sakila.entity.Film.specialFeatures 类型引起:对象

java - org.springframework.beans.factory.BeanCreationException : Error creating bean with name 'crudRepository'

spring - 如何将普通 CrudRepository<T,ID> 转换为 ReactiveCrudRepository<T,ID>

java - 组合规范并防止 NullPointerException 和 IllegalArgumentException

java - 带注释的 bean 配置看不到 XML 配置中的 bean