相关疑难解决方法(0)

JPA Criteria API:LEFT JOIN上的多个条件

我有一个像下面这样的连接引用,第一个连接表达式由JPA API自动构造.

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> c = cb.createTupleQuery();
Root<Demand> demands = c.from(Demand.class);
Join<Demand, Metadata> joinMetadata = demands.join("metadatas", JoinType.LEFT);
Run Code Online (Sandbox Code Playgroud)

但是,我想为我的joinMetadata添加一个aditional条件,如Metadata.type ="AFFECTATION_KEY",但我不知道如何.

非常感谢任何帮助

jpa left-join criteria-api

6
推荐指数
2
解决办法
2万
查看次数

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

假设您有以下 OneToMany 关系:School->Student->ScientificWork。现在您想要选择所有学生名为“John”且他的科学工作称为“黑洞”的学校。

我按照以下方式执行此操作,但由于某种原因,它返回了我所有可能的学校。

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')
        );
    };
}
Run Code Online (Sandbox Code Playgroud)

更新

找到这个答案后,我尝试了以下操作,但结果相同(它返回所有学校而不是一所):

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');
    };
}
Run Code Online (Sandbox Code Playgroud)

hibernate criteria-api spring-data spring-data-jpa

5
推荐指数
1
解决办法
1万
查看次数