1

次のようなコードがあります。

  public void doQuery(final Baz baz){
    final Query query = getSessionFactory().getCurrentSession().createQuery(
            "select distinct foo from Foo as foo "+
            "join foo.a as a"+
            "join foo.b as b "+
            "join b.c as c "+
            "where baz=:baz"
            );
    query.setParameter("baz", baz);
    final List<Foo> list = query.list();

    for (final Foo foo : list) {
        final Set<C> cSet = foo.getB().getCs();
        final String value = foo.getSomeValue();
        for (final C c : cSet) {                
            final Long key = c.getSomeLong();
            // Do stuff with key and value
        }
    }
  }

for ループが実行されるたびに、バックグラウンドで追加の hibernate クエリが実行され、余分なデータが取得されます (オブジェクトが遅延読み込みとしてマークされているため)。POJOを使用する他のクラスはそのデータを必要としないため、これらのオブジェクトを熱心に切り替えることは望ましくありません。

明らかに、上記のコードによってボトルネックが発生する可能性がありますが、これは避けたいものです。クエリを変更して必要なデータのみを一度に戻すための休止状態固有の方法 (つまり、ネイティブ SQL なし) はありますか?

Foo を返す代わりに、col1 をキーとして、col2 を値として、クエリが String[][] を返すようにしても問題ありません。

アップデート:

必要なキー/値のみを返すようにクエリを変更しました

"個別の c.id、foo.someValue を ... から選択

4

1 に答える 1

0

私が理解しているように、デフォルトでコレクションを熱心にしたくないのですが、これらの具体的なケース/メソッドでは、すべて1つのクエリでフェッチしますか?!

これに関する休止状態のドキュメントのフラグメントを次に示します。

「フェッチ」結合を使用すると、値の関連付けまたはコレクションを、単一の選択を使用して親オブジェクトとともに初期化できます。これは、コレクションの場合に特に役立ちます。アソシエーションとコレクションのマッピング ファイルの外部結合と遅延宣言を効果的にオーバーライドします。詳細については、セクション19.1「フェッチ戦略」を参照してください。

from Cat as cat
    inner join fetch cat.mate
    left join fetch cat.kittens

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html

于 2012-08-24T18:58:43.910 に答える