これは私の2つのエンティティのセットアップです:
public class Person {
public Guid Id {get;set;}
public string Name {get;set;}
}
public class Immortal : Person {
public string DarkName {get;set;}
}
それらのマッピングは次のようになります。
<class name="Person">
<id name="Id">
<generator class="guid.comb"/>
</id>
<property name="Name" />
<joined-subclass name="Immortal">
<key column='PersonId' />
<property name="DarkName" />
</joined-subclass>
</class>
これがセットアップです。2 つのエンティティがあり、一方は他方の結合されたサブクラスです。フォームから任意の数の条件を取得し、適切な条件をクエリに適用して結果を返す検索フレームワークがあります。
この場合、「名前」という単一のフォーム フィールドがあるとします。名前が Person の Name プロパティと一致するかどうかを確認することで、通常の人であろうと特別なクラスの不滅であろうと、すべての人を呼び戻したいのですが、 Immortal の場合、DarkName がフォームで指定されたものと一致する場合も一致としてカウントしたいと思います。
これは私のジレンマです。どうすればよいでしょうか。NHibernate の ICriteria に関して私ができる最善の方法は、Immortal でサブクエリを作成してそこで名前を確認し、ルートの Person ID がそのサブクエリに含まれているかどうかを確認することです。ただし、数万人のテーブルで作業する場合、結果を取得するこの方法は非常に非効率的であり、実際の状況ではリクエストがタイムアウトすることさえあります (30 秒以上)。
Immortal での外部結合でこのフィールドをチェックしたいので、HQL でもこれを行うことにオープンですが、HQL に任意のプロパティの 2 つの異なるエンティティで結合を実行させることはできません。マッピングの直接の関連付けに基づいている必要があることはわかっています。たとえば、これは私が見たいものです:
select person from Person person
outer join Immortal immortal on immortal.PersonId = person.Id
where
person.Name = :name or
immortal.DarkName = :name
あなたはスタックオーバーフローと何を言いますか?