次のようなコードがあります。
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 を ... から選択