假设我有下表:
Locations
================
LocationKey, LocationName
Employees
================
EmployeeKey, FirstName, LastName
EmployeeLocationXRef
================
EmployeeLocationXRefKey, LocationKey, EmployeeKey
TimeSheets
=================
TimeSheetKey, EmployeeLocationXRefKey, Minutes
好的,如您所见,为了让我获得 Location
和 Employee
的所有 TimeSheets
,我可以在 SQL 中执行以下操作
select
*
from TimeSheets ts
join EmployeeLocationXRef ex on (ex.EmployeeLocationXRefKey = ts.EmployeeLocationXRefKey)
join Locations l on (l.LocationKey = ex.LocationKey)
join Employees e on (e.EmployeeKey = ex.EmployeeKey)
where
l.LocationKey = 'xxxx'
and e.EmployeeKey = 'yyyy'
但我已经尝试了我能想到的所有方法,使用 @JoinTable
等在 JPA 中映射(带注释)。
有什么想法可以做到这一点吗?不幸的是,这是一个遗留系统,架构无法更改。
编辑
忘记提及 EmployeeLocationXRef
实体尚未直接映射。这可能是真正的问题。我将了解如何创建该实体映射,并看看它是否会使它变得更容易。
最佳答案
我没有发现这个模式有什么特别困难或奇怪的地方。每个表应该只有一个实体(除非有唯一的约束):
- 使用 JoinColumn 实现 EmployeeLocationXRef 和 Location 之间的 ManyToOne
- EmployeeLocationXRef 和 Employee 之间的 ManyToOne(使用 JoinColumn)
- Timesheet 和 EmployeeLocationXRef 之间的 ManyToOne,使用 JoinColumn
(这些关联当然可以是双向的,或者如果您愿意的话可以是另一个方向)。
JPQL 查询很简单
select ts from Timesheet ts
join ts.employeeXRef ex
join ex.location l
join ex.employee e
where
l.locationKey = 'xxxx'
and e.employeeKey = 'yyyy'
这是 SQL 查询的简单翻译。
关于java - 如何在 JPA 中注释这个复杂的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19716263/