2013-10-31 32 views
0

比方说,我有如下表:如何在JPA中注释这个复杂的连接?

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


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


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


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

OK,所以你可以看到,为了让我把所有的TimeSheets的一个LocationEmployee,我可以做的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

我没有看到任何特别困难或奇怪的关于这个模式。应该仅仅是每桌一个实体(除非有唯一约束):

  • EmployeeLocationXRef和位置之间的多对一,使用JoinColumn
  • EmployeeLocationXRef与员工之间的多对一,使用JoinColumn
  • 一ManyToOne在时间表和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查询的直接转换。

+0

忘了提及'EmployeeLocationXRef'实体没有被映射。 – cbmeeks

+0

嗯,这就是问题所在。它必须被映射。 –

+0

我很害怕这个。没什么大不了的。我们只是希望能够做一些像'location.getTimeSheets()'这样的东西。我想我们可以为它建立一个自定义的getter? – cbmeeks