2012-01-18 4 views
10

複数のレベルの継承を持つ複雑なクラス階層があり、その階層内でHQLを使用して特定の型を問い合せる必要があります。複数の型/クラスのHQLクエリ

私は、共通の基底クラスのAnimalを持つクラスCat、Dog、Monkeyを持っているとしましょう。

これらのうちのいくつかのみを選択するクエリを作成するにはどうすればいいですか?

また、特定の動物特性によって分類またはフィルタリングする必要があります。つまり、「性別=男性」、「名前」の動物を挙げましょう。

これは可能ですか?

答えて

11

JPQLの標準機能はで、Hibernateでもサポートされています(documentation)。

ください、例は、次のとおり

select a from Animal a 
where type(a) in ('Cat', 'Dog') 
    and a.sex = 'Male' 
order by a.name 

Hibernateはまた、.class暗黙のプロパティを使用する:

select a from Animal a 
where a.class in ('Cat', 'Dog') 
    and a.sex = 'Male' 
order by a.name 
+0

[NHの記事](http://knol.google.com/kに従って/ nhibernate-chapter-12-hql-the-hibernate-query-language)、Fabio Maulo著 "特殊なプロパティクラスは、多態性の永続性の場合にインスタンスの識別子値にアクセスします。その弁別者の価値に変換される」 - サポートされているようです私は明日の朝にそれを試し、結果をここに投稿します、ありがとう! –

+0

魔法の.classプロパティはNHのHQLとうまく機能します!警告として、Criteria APIはそれほど有用ではありません。Criteria APIはクラス名をdiscriminator値に変換せず、discriminatorを知ることを期待しているので、discriminatorをマッピングから手作業で取得するという恐ろしい回避策が必要でしたあらかじめ値恐ろしいもの。しかし、HQLを使ってうまくいく! –