Hibernate CriteriaBuilder:使用ON子句连接一对多

Hibernate CriteriaBuilder:使用ON子句连接一对多,hibernate,spring-data-jpa,spring-data,criteria-api,Hibernate,Spring Data Jpa,Spring Data,Criteria Api,假设你有以下一对关系:学校->学生->科学工作。现在你要选择所有的学校,这些学校的学生都叫“约翰”,他的科学工作叫做“黑洞” 我是这样做的,但出于某种原因,它让我重新选择了所有可能的学校 public static Specification<School> spec() { return (root, query, cb) -> { final SetJoin<School, Student> studs = root.joinSet("s

假设你有以下一对关系:
学校->学生->科学工作
。现在你要选择所有的学校,这些学校的学生都叫“约翰”,他的科学工作叫做“黑洞”

我是这样做的,但出于某种原因,它让我重新选择了所有可能的学校

public static Specification<School> spec() {
    return (root, query, cb) -> {
        final SetJoin<School, Student> studs = root.joinSet("students", JoinType.LEFT);
        final SetJoin<Student, ScientificWork> works = root.joinSet("works", JoinType.LEFT);
        return cb.and(
                cb.equal(studs.get(Student_.name), 'John'),
                cb.equal(nodes.get(ScientificWork_.name), 'Black Holes')
        );
    };
}
公共静态规范规范(){
返回(根、查询、cb)->{
最终设置连接螺柱=root.joinSet(“学生”,JoinType.LEFT);
final SetJoin works=root.joinSet(“works”,JoinType.LEFT);
返回cb和(
cb.equal(studs.get(学生姓名),“John”),
cb.equal(nodes.get(ScientificWork_uuzy.name),“黑洞”)
);
};
}
更新 找到后,我尝试了以下方法,但结果相同(它返回所有学校,而不是一所):

公共静态规范规范(){
返回(根、查询、cb)->{
最终设置连接螺柱=root.joinSet(“学生”,JoinType.LEFT);
studs.on(cb.equal(studs.get(学生名),'John');
final SetJoin works=root.joinSet(“works”,JoinType.LEFT);
返回cb.equal(nodes.get(ScientificWork_uuz.name),“黑洞”);
};
}
公共静态规范规范(){
返回(根、查询、cb)->{
最终连接螺柱=root.Join(“学生”,JoinType.LEFT);
studs.on(cb.equal(studs.get(学生姓名),“John”);
最终连接工程=螺柱连接(“工程”,连接类型。左);
返回cb.equal(works.get(ScientificWork_uuz.name),“黑洞”);
};
}


我使用了join而不是joinSet并将
**works**.get(ScientificWork\uuuu.name)
而不是
**nodes**.get(ScientificWork\uuu.name)

这可能吗?有人需要其他详细信息吗?您是否错误地使用了节点而不是works?这一行`final SetJoin works=root.joinSet(“works”,JoinType.LEFT);`应该是“final SetJoin works=studs.joinSet”(“works”,JoinType.LEFT);`还是打字错误?
public static Specification<School> spec() {
    return (root, query, cb) -> {
        final SetJoin<School, Student> studs = root.joinSet("students", JoinType.LEFT);
        studs.on(cb.equal(studs.get(Student_.name), 'John'));
        final SetJoin<Student, ScientificWork> works = root.joinSet("works", JoinType.LEFT);          
        return cb.equal(nodes.get(ScientificWork_.name), 'Black Holes');
    };
}
public static Specification<School> spec() {
return (root, query, cb) -> {
    final Join<School, Student> studs = root.join("students", JoinType.LEFT);
    studs.on(cb.equal(studs.get(Student_.name), "John"));
    final Join<Student, ScientificWork> works = studs.join("works", JoinType.LEFT);          
    return cb.equal(works.get(ScientificWork_.name), "Black Holes");
};