gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:14:08 25 4
gpt4 key购买 nike

鉴于这些实体:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com