Java 如何在JPA中注释这个复杂的连接?
假设我有以下表格:Java 如何在JPA中注释这个复杂的连接?,java,jpa,join,annotations,Java,Jpa,Join,Annotations,假设我有以下表格: Locations ================ LocationKey, LocationName Employees ================ EmployeeKey, FirstName, LastName EmployeeLocationXRef ================ EmployeeLocationXRefKey, LocationKey, EmployeeKey TimeSheets =======
Locations
================
LocationKey, LocationName
Employees
================
EmployeeKey, FirstName, LastName
EmployeeLocationXRef
================
EmployeeLocationXRefKey, LocationKey, EmployeeKey
TimeSheets
=================
TimeSheetKey, EmployeeLocationXRefKey, Minutes
好的,如您所见,为了让我获得位置
和员工
的所有时间表,我可以在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之间创建多工单
- 使用JoinColumn在EmployeeLocationXRef和Employee之间使用manyOne
- 时间表和EmployeeLocationXRef之间的多工单,使用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查询的直接翻译。忘记提到EmployeeLocationXRef
实体尚未映射。这就是问题所在。必须绘制地图,我很害怕。没什么大不了的。我们只是希望能够做一些类似于location.getTimeSheets()
的事情。我想我们可以为此定制一个getter?当然可以。但是,在查询中,您将无法隐藏EmployeeLocationXRef。