如何在JPA中注释这个复杂的连接?

时间:2013-10-31 20:41:37

标签: java jpa join annotations

我们说我有以下表格:

Locations
================
LocationKey,    LocationName


Employees
================
EmployeeKey,    FirstName,    LastName


EmployeeLocationXRef
================
EmployeeLocationXRefKey,    LocationKey,    EmployeeKey


TimeSheets
=================
TimeSheetKey,    EmployeeLocationXRefKey,    Minutes

好的,正如您所看到的,为了让我获得TimeSheetsLocation的所有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实体尚未直接映射。这可能是真正的问题。我将看到创建该实体映射,看看它是否更容易。

1 个答案:

答案 0 :(得分:1)

我没有看到任何关于此架构特别困难或奇怪的事情。每个表应该只有一个实体(除非有唯一约束):

  • EmployeeLocationXRef和Location之间的ManyToOne,使用JoinColumn
  • 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查询的直接翻译。