4

名前付きクエリと継承の使用について質問があります

次のようなビルドがある場合:

                               User (abstract) not persisted
                                    ¦
                    __________________________________
                    ¦               ¦                ¦

                Customer         Manager        Administrator        

そして、たとえばそれらを単一のテーブルに配置します(継承タイプ)

ユーザーリポジトリを使用してそれらをすべて取得する場合、名前付きクエリを使用できます。このためには、名前付きクエリを User エンティティに記述する必要があります。

親クラスの名前付きクエリで子クラスを取得することは可能ですか?

クラスごとに inheritancetype = Table を使用することを選択した場合、名前付きクエリを同じにすることはできませんか?

4

2 に答える 2

3

絶対。あなたが言うなら:

SELECT u FROM User u WHERE u.age >= 18

age(が のプロパティであると仮定) クエリは、指定された条件Userに一致するすべてのサブクラスを返します。User結果は になるので、 、またはList<User>にダウンキャストする必要があります。CustomerManagerAdministrator

継承戦略はここでは何もしません。を要求するとUser、JPA 実装は常に適切なサブクラスを返します。結局のところ、Userできますし、そうあるべきですabstract

于 2013-01-24T18:33:57.120 に答える
1

名前付きクエリは永続化ユニットのどこにでも定義でき、定義されているクラスを直接処理する必要はありません。ユーザーが関与する場合は、ユーザーにそれらを持たせることは理にかなっています。継承に関しては、JPA では、「ユーザー ユーザーからユーザーを選択する」タイプのクエリは、選択基準に一致するユーザーを返す必要があります。これには、使用される継承のタイプに関係なく、Customers、Manager、および User と見なされるすべてのサブクラスが含まれます。単一のテーブル、結合、クラスごとのテーブル - すべてサブクラスを返す必要があります。そのため、不必要な継承のために高価なクエリを作成しないように注意する必要があります。

JPA では、JPQL で TYPE() 関数を使用して制限できるため、特定のクラスを結果に含めたり除外したりできます。JPA 2.1 には、同様の機能を実行する TREAT が含まれます。

于 2013-01-24T18:35:02.473 に答える