使用Criteria和Metamodel API在多个外键上连接两个表

时间:2015-01-23 23:16:01

标签: java sql jpa criteria-api

假设我们有以下五个数据库表: 员工,客户,月,现场和付款。

给出以下(Oracle)SQL查询:

select * from onsite o
join client c on o.client_id = c.client_id
left join payment p on (o.client_id = p.client_id and o.employee_id = p.employee_id and o.month_cd = p.month_cd)
where p.payout_date is null and c.name = 'example';

它加入了三张桌子。第一个内连接很简单,client_id是Client表中的主键和Onsite中的外键。 假设我们有EmployeeEntity_,ClientEntity_,MonthEntity_,OnsiteEntity_和PaymentEntity_元模型类,它看起来像Criteria API:

EntityManager em = ...;
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<OnsiteEntity> cq = cb.createQuery(OnsiteEntity.class);
Root<OnsiteEntity> root = cq.from(OnsiteEntity.class);
Join<OnsiteEntity, ClientEntity> client = root.join(OnsiteEntity_.client);

Onsite和Payment表都包含三个到Employee,Client和Month表主键的外键。 左连接连接这三个外键上的Onsite和Payment表。

问题是如何使用元模型类表达两个未连接表与JPA Criteria API 的左连接?

1 个答案:

答案 0 :(得分:0)

您可以将JoinType.LEFT用作join参数(https://en.wikibooks.org/wiki/Java_Persistence/Criteria#JoinType

root.join(OnsiteEntity_.client, JoinType.LEFT);