鉴于这些实体:
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/