1

Pet という基本クラスと、Pet を継承する 2 つのサブクラス Cat と Dog があるとします。

これらを Pet、Cat、Dog の 3 つのテーブルにマップするだけです。Pet テーブルには基本クラスのプロパティが含まれ、Cat テーブルと Dog テーブルには Pet テーブルへの外部キーと、猫または犬に固有の追加プロパティが含まれます。結合されたサブクラス戦略。

さて、NHibernate と ICriteria を使用して、他のテーブルへの結合を行わずに、すべての異なるペットのリストをCat オブジェクトや Dog オブジェクトではなくPet オブジェクトとして取得するにはどうすればよいでしょうか? Pet に含まれる情報にのみ関心があります。

4

6 に答える 6

1

私はちょうど似たようなことをしました、そしてAyendeによるこのブログ投稿は非常に役に立ちました!私は結合サブクラスアプローチを採用しましたが、これは基本クラスのクエリを適切にサポートします。

ただし、参加せずに「ペットのみ」を見つけるには、クラスごとのテーブル階層アプローチが必要だと思います。または、サブクラスごとのテーブルを使用して、サブクラスで左結合を実行し、左結合のいずれにも一致しない行に制限することもできます。

于 2009-12-11T16:38:07.987 に答える
0

うーん、「ペットとして」を選択すると、すべてのオブジェクト(サブクラス化されていないペットだけでなく)が返されると思います。私はそれを行うためのきれいな方法を知りませんが、それなら私はNHの専門家ではありません。

たぶん、親テーブルの識別子列に直接クエリを実行できますか? おそらく、HQLやICriteriaではなく、カスタムSQLクエリに再対応する必要があります。

于 2009-12-11T07:53:08.700 に答える
0

Why not create a new map for "PetsOnly" and and remove your discriminator and other non required fields? I think Kristoffer above aluded to the same thing; should still give you full insert update and delete select support. The pet is only a Pet...

于 2010-03-31T14:23:07.617 に答える
0

Criteria API でこれができるとは思えません。ただし、HQL でそれを行うことができます。

var hql = @"from Pet p where p.class = Pet";
于 2010-03-30T11:25:34.400 に答える
0

これはうまくいくようです:

Petテーブルのすべての列を選択するビューを作成しました。次に、ビューにマップする単純な DTO クラスを作成しました。その後、ICriteria を使用できます。

おそらく最も美しいまたは最もクリーンなソリューションではありませんが、動的クエリ文字列よりも操作が簡単であることは確かです。

于 2010-03-24T20:48:34.193 に答える