Hibernateでの検索高速化(個人的に)

Hibernateで検索処理を実装する時に、普段は

Criteria criteria = session.createCriteria(Hoge.class);
criteria.add(Restrictions.eq("Delete", false));
  :
  様々な条件設定
  :
List<Hoge> list = criteria.list();
for(Hoge hoge : list) {
 :
 テーブルに表示など
 :
}

としていたのですが、マッピング定義がイマイチ苦手なせいか、クラスによっては
検索に数十秒掛かる状態になっていました。

criteria.setFetchMode("HogeDetail", FetchMode.JOIN);

の様に関連のあるクラスをsetFetchMode()で連結することで高速化も図れますが、
イマイチ高速化は図れずという状態でした。
実はそんな状態を数ヶ月放置していたのですが、そういえばと思って下の方法を試してみました。

Criteria criteria = session.createCriteria(Hoge.class);
criteria.add(Restrictions.eq("Delete", false));
  :
  様々な条件設定
  :
// 上記条件にマッチする主キーの一覧を取得
criteria.setProjection(Projections.groupProperty("CD"));
List<Integer> keyList = criteria.list();

// 主キー一覧をIn条件に設定する
criteria = session.createCriteria(Hoge.class);
criteria.add(Restrictions.in("CD", keyList));

List<Hoge> list = criteria.list();
for(Hoge hoge : list) {
 :
 テーブルに表示など
 :
}

条件にマッチする主キーをListで受け取り、それに対してInを指定するという流れです。

結果的に検索時間は5分の1位に短縮されました。
それでもまだ遅いですし、そもそもマッピング定義が多分ダメなので
根本的な解決にはなりませんが、恒久的な暫定対応と言うダメな感覚で。。