3

次のような単純なデータモデルがあります。

  • エンティティ 1: EmployeeAsset。これには Employee オブジェクトへの参照があります。
  • エンティティ 2: EmployeeJobPosition。これには従業員への参照もあります。また、OrganisationUnitEntry (これは別のエンティティ クラス) オブジェクトのコレクションを含む JobPosition (これは別のエンティティ クラス) オブジェクトへの参照もあります。

パラメータとして、ユーザーが選択した OrganizationUnitEntry オブジェクトのコレクションがあります (これを ouEntries と呼びましょう)。ouEntries のスーパーセットである OrganizationUnitEntry コレクションを持つ JobPosition に関連するすべての EmployeeAsset オブジェクトを返すクエリが必要です (つまり、ouEntries は ...jobPosition.organisationUnitEntries のサブセットです)。

したがって、クエリは次のようなもので動的に構築できます。

SELECT ea
FROM EmployeeAsset ea, EmployeeJobPosition ejp
WHERE ea.employee = ejp.employee
AND :orgUnitEntry1 MEMBER OF ejp.jobPosition.organisationUnitEntries
...
AND :orgUnitEntryN MEMBER OF ejp.jobPosition.organisationUnitEntries

(orgUnitEntry1 - N は ouEntries の単なる要素です)。

ただし、サブセット型の関数の方がはるかに優れているため、これを静的/名前付きクエリに入れることができます。これは通常好みです。何かのようなもの

...
AND :ouEntries SUBSET OF ejp.jobPosition.organisationUnitEntries

このようなクエリを作成する最善の方法についてのアイデアはありますか?

4

1 に答える 1

0

INは使えますか?

SELECT ea
FROM EmployeeAsset ea, EmployeeJobPosition ejp join ejp.jobPosition.organisationUnitEntries o
WHERE ea.employee = ejp.employee
AND o IN :ouEntries

JPA プロバイダーによっては、ID をオブジェクトではなく IN と比較する必要がある場合があります。EclipseLink では、オブジェクトを比較できます (>=2.4)。

于 2013-08-14T14:40:02.477 に答える