2010-12-04 11 views
4

私はこの質問をHibernateフォーラムで尋ねましたが、完全な応答を得られなかったので、私はここでそれを再投稿すると思っていました。ここでは元の質問スレッドです:一言で言えばどのHibernate FetchModeによってコレクションが遅延ロードされるのですか?

http://forum.hibernate.org/viewtopic.php?f=1&t=1008243&p=2438963#p2438963

が、私は一緒に2つの完全に無関係なテーブルを結合するカスタムHQLクエリを持っている、と私は予防しようとしている「O(N + 1)を選択」私のHibernateでマップされたPOJOに存在する関連するコレクションの読み込みを無効にすることで問題が発生します。

明らかに、私はこれにHibernate fetch profilesを使うことができますが、そこに不具合があります。ここではHibernateのFetchMode.javaが言っていることだ。だから、

/** 
* Fetch using an outer join. Equivalent to <tt>fetch="join"</tt>. 
*/ 
public static final FetchMode JOIN = new FetchMode("JOIN"); 
/** 
* Fetch eagerly, using a separate select. Equivalent to 
* <tt>fetch="select"</tt>. 
*/ 
public static final FetchMode SELECT = new FetchMode("SELECT"); 

/** 
* Fetch lazily. Equivalent to <tt>outer-join="false"</tt>. 
    * @deprecated use <tt>FetchMode.SELECT</tt> 
*/ 
public static final FetchMode LAZY = SELECT; 

、「LAZYは、」それは私が避けるようにしようとしている正確に何である、「SELECT」だけだ、本当に怠け者ではありません。

コレクションが読み込まれないようにするフェッチモードはありますか?そうでない場合は、特定のHQLクエリの実行中にコレクションのロードを無効にする別の方法がありますか?

私は、これを達成するための従来の方法はCriteriaクエリを使用することであることを認識していますが、私は任意のプロパティに対して結合を行う必要があり、私が知る限り、そのための基準はありません。

答えて

5

まず、休止状態のデフォルトの動作は遅延ロードを使用することだと思います。そうでない場合はチェックしてください。

そして、私は彼らがドキュメントのコメントを間違っていると思うし、SELECTは実際には怠惰なフェッチになるはずです(最新バージョンのドキュメントの 'eagerly'が削除されています)。

+0

これを試したところ、実際には 'SELECT'は遅延フェッチを引き起こします。 – Asa

関連する問題