gpt4 book ai didi

java - JPA Criteria API Join 3 Tables get 1 Type

转载 作者:行者123 更新时间:2023-12-05 06:40:30 25 4
gpt4 key购买 nike

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

实体是:

| Employee |   | Contract |   | Company |
|----------| |----------| |---------|
| id | | Company | | id |
| age | | Employee | | name |
  • 契约(Contract)是公司与员工之间的关系
  • 一名员工可能属于一家或多家公司
  • 一家公司有一名或多名员工

我现在尝试让所有为公司 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”工作的员工的契约(Contract)列表。

如何编写查询以获取员工列表而不是契约(Contract)?

最佳答案

从 Employees 的 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自己创建关系表。
查看评论了解更多信息。

关于java - JPA Criteria API Join 3 Tables get 1 Type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42525867/

25 4 0