Jan*_*Jan 5 java hibernate jpa jpql java-ee
想象一下表emp:
CREATE TABLE emp
( id NUMBER
, name VARCHAR
, dept_code VARCHAR
)
Run Code Online (Sandbox Code Playgroud)
和一个表部门:
CREATE TABLE dept
( code VARCHAR
, name VARCHAR
)
Run Code Online (Sandbox Code Playgroud)
emp.dept_code
引用dept.code
为ForeignKey.
这些表映射到JPA实体,ForeignKey被建模为关联:
@ManyToOne
@JoinColumn(name = "dept_code")
private Department department;
Run Code Online (Sandbox Code Playgroud)
鉴于以下数据:
emp dept
---------------- ------------------
1 John SALS SALS Sales
2 Louis SALS SUPT Support
3 Jack SUPT
4 Lucy SUPT
Run Code Online (Sandbox Code Playgroud)
我想编写一个JPA查询,返回支持部门中的所有Emloyees.假设我知道支持部门的PrimaryKey(SUPT
)
我猜那会是:
SELECT emp
FROM Employee emp JOIN emp.department dept
WHERE dept.code = 'SUPT'
Run Code Online (Sandbox Code Playgroud)
题:
由于部门密钥SUPT
代码在emp表中可用,是否有办法通过避免 JOIN到部门实体来重写JPA查询?
这会导致性能提升吗?或者是一个JPA实现(如Hibernate)足够聪明,以避免数据库加入dept表?
您通常会将查询编写为
select emp
from employee emp
where emp.department.code = 'SUPT'
Run Code Online (Sandbox Code Playgroud)
并让您的提供商找出得出结果的最佳方法。就休眠而言,是的,它足够聪明,意识到它可以只查看连接列。
编辑:值得注意的是,您尚未在注释中设置延迟加载,因此无论如何它都会加入表以创建部门实体:)