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。
查看评论了解更多信息。
我正在尝试将 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。
查看评论了解更多信息。