このアプリケーションでは、アプリケーションのニーズに基づいてさまざまなオブジェクトを lazy false に設定しています。ただし、ユース ケースの 1 つで、HBM ファイル内のすべての遅延設定を無視して、ターゲット オブジェクトのみを取得する必要があります。
問題は、HBM の設定に関係なく、ターゲット オブジェクトのみを取得するように HQL で指定する方法はありますか?
〜スリ
このアプリケーションでは、アプリケーションのニーズに基づいてさまざまなオブジェクトを lazy false に設定しています。ただし、ユース ケースの 1 つで、HBM ファイル内のすべての遅延設定を無視して、ターゲット オブジェクトのみを取得する必要があります。
問題は、HBM の設定に関係なく、ターゲット オブジェクトのみを取得するように HQL で指定する方法はありますか?
〜スリ
実行前にCriteriaでsetFetchModeを使用して、HBMファイル設定をオーバーライドできます。
申し訳ありませんが、質問を理解したかどうかはわかりません。
特定のクラスに実装する必要がある場合は、SetFetchModeを使用できます。
var query = session.CreateCriteria(typeof(MyClass));
query.SetFetchMode("PropertyA", FetchMode.Select);
query.SetFetchMode("PropertyB", FetchMode.Select);
注:多対1の参照の場合、エンティティクラス自体をlazy=trueでマップする必要があります。そうでない場合、NHibernateはそのプロキシクラスを作成しません。
これは、ジェネリックで型に依存しない方法で型を遅延ロードする場合の答えです。
メタデータでそれらを見つけて、条件にフェッチモードを追加することができます
私はそれを試しませんでしたが、次のコードから始めます。
var meta = sessionfactory.GetClassMetaData(typeof(MyClass));
var query = session.CreateCriteria(typeof(MyClass));
for(int index = 0; index < meta.PropertyType.Length; index++)
{
if (meta.PropertyType[index] == NHibernateUtil.Entity)
{
query.SetFetchMode(meta.PropertyNames[index], FetchMode.Select);
}
}
これにはコレクションは含まれません。それらはおそらくで見つかりfactory.GetCollectionMetadata(roleName)
ますが、を見つける必要がありますroleName
。