1-2.Hibernateの検索機能とcreateCriteriaの代案について

2020-10-25

こんにちは管理人(@vip___p)です。

今回はhibernateのバージョンの違いで苦労した点について
触れていこうと思います。備忘録用です。

Hibernateの参考サイトは海外が多いことや
バージョンが古い記事が上がっていることが多く苦労しました。

具体的にはコードはcreateCriteria(Sample.class);についてです。

同じような方は方は是非参考にしてください。

xmlの設定についてはこちら

HibernateのSessionの保存や削除について

Hibernate/cfg.xml/hbm.xml/propertiesの設定

HibernateのExpressionの代わり

createCriteriaが非推奨

Hibernate

古いバージョンで多用されていた
createCriteria非推奨になっておりました。

Criteria criteria = session.createCriteria(Sampl.class).list();

改善案としては下記を使用しました。

// Create CriteriaBuilder
CriteriaBuilder builder = session.getCriteriaBuilder();
// Create CriteriaQuery
CriteriaQuery createQuery = builder.createQuery(Sample.class);

createQuery.from(Sample.class);

注意と疑問

引数からデータを絞り込む際(検索処理等)
DBのデータ量が多くなると使用できなるので注意が必要です。
データ量が多くても以前のコードだと問題なく動きます。

// Create CriteriaBuilder
Criteria criteria = session.createCriteria(Sampl.class);
// 引数の値が存在する場合
if (hikisuu!=null) {
	// hikisuuがテーブルnameの値と等しいとき追加
	criteria.add( expression.eq("name", hikisuu)
} //リスト化
List list = criteria.list();
// 一致する値を返却
return list;

改善案を使用した場合

// Create CriteriaBuilder
CriteriaBuilder builder = session.getCriteriaBuilder();
// Create CriteriaQuery
CriteriaQuery createQuery = builder.createQuery(Sample.class);

createQuery.from(Sample.class);
// データ量によってはリスト化すると落ちる場合あり
List list = session.createQuery(createQuery).getResultList();

List listA = = new ArrayList();
for(Sample i :list){
	// 一致する場合追加
	if(i.getHikisuu.equals(hikisuu)){
		listA.add(i)	
	}
	return list;
}

この方法だと一度すべてリスト化するのでDBのデータ量が多くなると
重くなるまたは、止まってしまうので注意してください。

まとめ

まとめ

今回のまとめです。
廃止されたcreateCriteriaについてまとめました。
同じような人で悩んでいる方の参考になれば幸いです。