0

假设我有以下表格:

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


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


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


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

好的,如您所见,为了让我获得所有TimeSheetsfor a Locationand 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'

但是我已经尝试了所有我能想到的在 JPA 中使用(带注释)映射的方法@JoinTable,等等。

任何想法如何做到这一点?不幸的是,这是一个遗留系统,无法更改架构。

编辑

忘了提EmployeeLocationXRef实体没有直接映射。这可能是真正的问题。我将了解如何创建该实体映射,看看它是否更容易。

4

1 回答 1

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 查询的直接翻译。

于 2013-10-31T20:53:18.260 回答