1

このアプリケーションでは、アプリケーションのニーズに基づいてさまざまなオブジェクトを lazy false に設定しています。ただし、ユース ケースの 1 つで、HBM ファイル内のすべての遅延設定を無視して、ターゲット オブジェクトのみを取得する必要があります。

問題は、HBM の設定に関係なく、ターゲット オブジェクトのみを取得するように HQL で指定する方法はありますか?

〜スリ

4

2 に答える 2

1

実行前にCriteriaでsetFetchModeを使用して、HBMファイル設定をオーバーライドできます。

于 2009-05-15T06:48:35.680 に答える
0

申し訳ありませんが、質問を理解したかどうかはわかりません。

特定のクラスに実装する必要がある場合は、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

于 2009-05-15T07:03:20.403 に答える