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位に短縮されました。
それでもまだ遅いですし、そもそもマッピング定義が多分ダメなので
根本的な解決にはなりませんが、恒久的な暫定対応と言うダメな感覚で。。