java - 使用 Criteria 和 Metamodel API 连接多个外键上的两个表

标签 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 表达两个未连接表的左连接

最佳答案

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

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

关于java - 使用 Criteria 和 Metamodel API 连接多个外键上的两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28120282/

相关文章:

MySQL更新更改多列是非原子的?

java - Vaadin 7 示例与 Maven

sql - 本月第 3 个 <day_of_week> - MySQL

java - 使用反射方法检索类的通用参数是否保证有效(在我的例子中)?

SQL,优化我的查询 : UNION vs OR

java - Spring Boot - javax Import 语句无法正常工作

java - Hibernate Criteria API - 添加标准 : string should be in collection

java - entitymanager.merge() 可以作用于克隆的实体对象吗

java - 从 Fragment 更改为 Activity

java - 有人能解释一下为什么这个 While 语句必须是 AND