假设我们有以下五个数据库表:
员工,客户,月份,现场和付款。
给定以下(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);
现场表和付款表都包含三个外键,分别指向Employee,Client和Month表的主键。
左联接将这三个外键上的“现场”和“付款”表联接在一起。
问题是如何使用元模型类用JPA Criteria API表示两个未连接表的左连接?
最佳答案
您可以将JoinType.LEFT
用作join
参数(https://en.wikibooks.org/wiki/Java_Persistence/Criteria#JoinType)
root.join(OnsiteEntity_.client, JoinType.LEFT);