我正在尝试使用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”中工作的雇员。
如何编写查询以获取员工列表而不是合同?
答案 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自己创建关系表 有关详细信息,请参阅评论。