【问题标题】:Join two tables on multiple foreign keys using Criteria and Metamodel APIs使用 Criteria 和 Metamodel API 在多个外键上连接两个表
【发布时间】: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 表达两个未连接表的左连接

【问题讨论】:

标签: java sql jpa criteria-api


【解决方案1】:

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

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

【讨论】:

  • 问题是如何在Criteria API中表达两个不相关的表(Onsite,Payment)的左连接。你能写一个具体的例子吗?
  • 哦,抱歉,我没看到。您可以发布您的实体的代码吗?
猜你喜欢
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多