JPA 条件 API 加入 3 个表得到 1 个类型

JPA Critera API Join 3 Tables get 1 Type

我正在尝试将 3 table 与 JPA Critera API 连接起来,并将结果作为关系 table 以外的类型列表。

实体是:

| Employee |   | Contract |   | Company |
|----------|   |----------|   |---------|
| id       |   | Company  |   | id      |
| age      |   | Employee |   | name    |

我现在尝试让所有为 A 公司工作的员工像这样:

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Contract> query = cb.createQuery(Contract.class);

    Root<Contract> contracts = query.from(Contract.class);
    Join<Contract, Company> companyJoin = contracts.join("company");
    Join<Contract, Employee> employeeJoin = contracts.join("employee");

    List<Predicate> conditions = new ArrayList<Predicate>();
    conditions.add(cb.equal(companyJoin.get("name"), "Company A"));

    TypedQuery<Practice> typedQuery = em.createQuery(query
            .select(contracts)
            .where(conditions.toArray(new Predicate[conditions.size()]))
    );

    typedQuery.getResultList();

这给了我 合同 的列表,其中有在 "Company A".

工作的员工

如何编写查询以获取 员工列表 而不是合同列表?

Root 名员工开始并创建一个连接链:

CriteriaQuery<Employee> query = cb.createQuery(Employee.class);
Root<Employee> employee = query.from(Employee.class);
Join<Employee, Contract> contractJoin = employee.join("contracts"); // assuming that Employee has a collection property named contracts
Join<Contract, Company> companyJoin = contractJoin.join("company");

这是正确的 Awnser,添加了以下内容:

类型 "Employee" 和 "Company" 必须有一个带有 @JoinTable 注释的字段 "companies" / "employees",如下所示:

员工:

...
@OneToMany
@JoinTable(name="Contract" ...)
private List<Company> companies;
...

公司

...
@OneToMany
@JoinTable(name="Contract" ...)
private List<Employee> employees;
...

“@JoinTable”注释阻止 hibernate 自行创建关系 table。
查看评论了解更多信息。