【发布时间】:2015-03-23 02:30:46
【问题描述】:
假设我们有以下五个数据库表: 员工、客户、月份、现场和付款。
给定以下 (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 表的主键的三个外键。 left join 在这三个外键上连接 Onsite 和 Payment 表。
问题是如何使用元模型类通过 JPA Criteria API 表达两个未连接表的左连接?
【问题讨论】:
-
我有一个非常相似的问题,这个答案 (stackoverflow.com/a/46814689/10393763) 提供了答案。定义多个 Root 对象,并在 where 子句中加入。
标签: java sql jpa criteria-api