JPA Criteria 2弱化了JOIN和它们之间的条件

问题描述

我将使我的问题适应一个简单的例子。可以说我有两个实体:Employee和EmployeeCompany(定义Employee与Company的关系的类)。

我需要检索与2个EmployeeCompany实体关联的Employee实体,并且这2个EmployeeCompany实体必须为特定属性共享相同的值(我们将此属性称为“ X”)。 EmployeeCompany实体也带有标识,因此实体定义看起来像这样:

Employee:
    Long idEmployee;
    List<EmployeeCompany> employeeCompanies;

EmployeeCompany:
    // Embebbed ID
    EmployeeCompanyId id;
    Long X;

EmployeeCompanyId:
    Long idEmployee;
    Long idCompany;

这是我目前正在做的工作,以从Employee实体开始的EmployeeCompany表进行2个JOIN:

Root<T> root = criteria.from(Employee.class);
Join<Object,Object> joinFirstemployeeCompanyId = root.join("employeeCompanies").join("id");
Predicate finalPredicate = builder.equal(joinFirstemployeeCompanyId.get("idCompany"),idCompany1);
Join<Object,Object> joinSecondEmployeeCompanyId = root.join("employeeCompanies").join("id");
finalPredicate = builder.and(finalPredicate,builder.equal(joinSecondEmployeeCompanyId.get("idCompany"),idCompany2));

我的问题是,我现在不知道如何指定在这2个联接之间它们必须满足X属性条件(两个EmployeeCompany实体的X属性值必须相同)。

在有帮助的情况下,这是SQL查询的样子:

SELECT * FROM Employee e
INNER JOIN EmployeeCompany ec1 ON ec1.idemployee = e.idemployee AND ec1.idcompany = :idCompany1
INNER JOIN EmployeeCompany ec2 ON ec2.idemployee = e.idemployee AND ec2.idcompany = :idCompany2
WHERE c1.X = c2.X

解决方法

我这样解决了我的问题:

Root<T> root = criteria.from(Employee.class);
Join<Object,Object> joinFirstEmployeeCompany = root.join("employeeCompanies");    
joinFirstEmployeeCompany.on(builder.equal(joinFirstEmployeeCompany.get("id").get("idCompany"),idCompany1));
Join<Object,Object> joinSecondEmployeeCompany = root.join("employeeCompanies");
joinSecondEmployeeCompany.on(builder.equal(joinSecondEmployeeCompany.get("id").get("idCompany"),idCompany2));
Predicate finalPredicate = builder.equal(joinFirstEmployeeCompany.get("X"),joinSecondEmployeeCompany.get("X"));