假设我有以下表格:
Locations
================
LocationKey, LocationName
Employees
================
EmployeeKey, FirstName, LastName
EmployeeLocationXRef
================
EmployeeLocationXRefKey, LocationKey, EmployeeKey
TimeSheets
=================
TimeSheetKey, EmployeeLocationXRefKey, Minutes
好的,如您所见,为了让我获得
TimeSheets
和Location
的所有Employee
,我可以在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
使用JoinColumn在EmployeeLocationXRef和Employee之间建立一个ManyToOne
使用JoinColumn在时间表和EmployeeLocationXRef之间建立一个ManyToOne
(当然,可以将这些关联设为双向的,也可以设为另一个方向)。
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查询的直接翻译。