2011-02-03 4 views
11

私は汎用テーブル "Sample"でクエリを構築しています。このテーブル "SampleOne"、 "SampleTwo"から継承するいくつかの型があります。Java/JPA |指定された継承型のクエリ

タイプは、テーブルの弁別値になり
select s from Sample where s.type = :type 

: は、私のようなクエリが必要です。それはどのような方法で可能です(と、エンティティ固有のクエリ、各SampleOne、SampleTwoのための1つを作成するために避ける...など)

私は大いに

敬具、 P、このトピックの任意の入力をお願い申し上げます。

答えて

15
あなたが TYPE表現を使用することができますJPA 2.0では

(現在はそれが休止状態のパラメータでは動作しませんが、HHH-5282を参照してください):

select s from Sample s where TYPE(s) = :type 

同様の休止状態特異的な発現が.class次のとおりです。

select s from Sample s where s.class = :type 
+0

申し訳同様のトピックに関する新しい議論を開始するが、私はのように抽象クラス提供する場合、それは動作しません:タイプを

あなたはこのような何かを行うことによって、この問題を回避することができますか? –

+0

https://hibernate.atlassian.net/browse/HHH-4881によると、これはHibernate 4.0.0で修正されました。CR5 –

3

ここrelevant section of the Java EE 6 tutorialです:

抽象エンティティ

抽象クラス は@Entityでクラスを修飾して によってエンティティとして宣言できます。 抽象エンティティは具体的な エンティティのようなものですが、インスタンス化することはできません。

要約エンティティは、具体的なエンティティのように、ちょうど と照会することができます。

select s from Sample where s.type = :type 
:私はこの権利、あなたのクエリを読めば

@Entity 
public abstract class Employee { 
    @Id 
    protected Integer employeeId; 
    ... 
} 
@Entity 
public class FullTimeEmployee extends Employee { 
    protected Integer salary; 
    ... 
} 
@Entity 
public class PartTimeEmployee extends Employee { 
    protected Float hourlyWage; 
} 

:抽象 エンティティは、クエリの対象である場合は、 クエリは抽象エンティティのすべての具象 のサブクラスで動作します

typeがdiscriminator列の場合にのみ、指定されたサブタイプの要素を返す必要があります。そのため、結果リストを要求されたサブタイプにキャストする必要があります。

1

TYPE()の実装にはまだ問題があるので、Hibernate 4.3.7では注意が必要です。例えば、

from SpoForeignPilot sfp where TYPE(sfp.partDocument) = :type 

SpoForeignPilotの種類を間違ってチェックし、ドキュメントの種類を誤って確認するため、このクエリは機能しません。

select sfp from SpoForeignPilot sfp join sfp.partDocument doc where TYPE(doc) = :type 
+0

これは5歳の質問に何も追加しません。 – meskobalazs

+2

私は、提案されたソリューション(jpa 2でTYPEを使用)をより複雑なクエリに使用したいという人に警告したいと思っていますが、まだ問題があります(このスレッドでソリューションを使用するときにこの問題が発生しました)。あなたは正しいです、質問の質問はこの問題を公開しません。 –

+0

@WimDeRammelaere時間をかけて頭を撫でると、あなたの答えは私の質問で問題を見つけるのを助けました。要するに、where句で** type **を使用した場合、ジョインに適用すると機能しますが、パス式で使用すると結果が見つかりませんでした。 – Maciek

関連する問題