0

次のテーブルがあるとします。

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


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


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


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

OK、ご覧のとおり、すべてのTimeSheetsfor aLocationとを取得するに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エンティティが直接マッピングされていないことを忘れていました。これが本当の問題になる可能性があります。そのエンティティ マッピングの作成について見て、それが簡単になるかどうかを確認します。

4

1 に答える 1

1

このスキーマについて特に難しいことや奇妙なことは何もありません。テーブルごとに 1 つのエンティティが存在する必要があり、(一意の制約がない限り):

  • JoinColumn を使用して、EmployeeLocationXRef と Location の間の ManyToOne
  • JoinColumn を使用して、EmployeeLocationXRef と Employee の間の ManyToOne
  • JoinColumn を使用して、Timesheet と EmployeeLocationXRef の間の ManyToOne

(もちろん、これらの関連付けは双方向にすることも、必要に応じて反対方向にすることもできます)。

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 に答える