JPA Critera API Join 3 Tables获得1种类型

时间:2017-03-01 07:40:58

标签: java jpa criteria-api

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

实体是:

| 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();

这为我提供了一份合同列表,其中包含在“公司A”中工作的雇员。

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

1 个答案:

答案 0 :(得分:0)

从一个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,增加了以下内容:

类型“员工”和“公司”必须有一个带有@JoinTable注释的字段“公司”/“员工”,如下所示:

<强>员工:

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

<强>公司

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

“@JoinTable”注释可以防止hibernate自己创建关系表 有关详细信息,请参阅评论。

相关问题