JPA 支持没有对象关系映射的外部连接
JPA support for outer joins without object relational mapping
最近我不得不在两个没有对象关系映射的 JPA 实体之间使用外部连接。根据规范和论坛帖子,仅当实体在 JPA 级别映射时才支持外部联接。
示例代码如下。要求是找没有订单的客户
@Entity
class Customer {
private int id;
}
@Entity
class Order {
private int customerId;
public int getCustomerId() { return customerId; }
public void setCustomerId(int customerId) { this.customerId = customerId ; }
}
就我而言,我不得不选择本机查询来完成工作。
关于未来的 JPA 规范是否支持没有关系映射的外部连接有什么想法吗?
谢谢
拉凯什
您可以使用 theta 样式的联接来模拟 INNER JOIN:
select c, o
from Customer c, Order o
where c.id= o.customerId
大多数现代数据库引擎查询优化器会将它变成 INNER JOIN equivalent anyway。
假设您在 Order
实体中有 customerId
字段 (Integer
)。为了找到没有任何订单的客户,您可以使用子查询来避免外连接和本机查询:
select c from Customer c where id not in (select customerId from Order)
通过这种方式,您可以在 JPQL (HQL) 中实现相同的目标。
最近我不得不在两个没有对象关系映射的 JPA 实体之间使用外部连接。根据规范和论坛帖子,仅当实体在 JPA 级别映射时才支持外部联接。
示例代码如下。要求是找没有订单的客户
@Entity
class Customer {
private int id;
}
@Entity
class Order {
private int customerId;
public int getCustomerId() { return customerId; }
public void setCustomerId(int customerId) { this.customerId = customerId ; }
}
就我而言,我不得不选择本机查询来完成工作。
关于未来的 JPA 规范是否支持没有关系映射的外部连接有什么想法吗?
谢谢 拉凯什
您可以使用 theta 样式的联接来模拟 INNER JOIN:
select c, o
from Customer c, Order o
where c.id= o.customerId
大多数现代数据库引擎查询优化器会将它变成 INNER JOIN equivalent anyway。
假设您在 Order
实体中有 customerId
字段 (Integer
)。为了找到没有任何订单的客户,您可以使用子查询来避免外连接和本机查询:
select c from Customer c where id not in (select customerId from Order)
通过这种方式,您可以在 JPQL (HQL) 中实现相同的目标。