Учитывая эти сущности:
public class Parent {
private List<Child> children;
// others fields
}
public class Child {
private Parent parent;
// others fields
}
Я хочу применить спецификацию, которая существует для Parent
, но с Child
как root:
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>
?