2013-10-31 35 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