Hibernate Criteria APIは、Hibernate Query Language(HQL)のオブジェクト指向でエレガントな代替手段です。これは、多くのオプションの検索基準を持つアプリケーションにとって常に優れたソリューションです。
HQLとCriteriaの例
1. HQLの例
HQLでは、これが ‘where’構文を追加する最初の基準であるかどうかを比較し、日付を適切なフォーマットにフォーマットする必要があります。それは仕事ですが、ロングコードは醜く、扱いにくく、エラーが起こりやすい文字列連結は、SQLインジェクションのようなセキュリティ上の懸念を引き起こす可能性があります。
public static List getStockDailtRecord(Date startDate,Date endDate,
Long volume,Session session){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
boolean isFirst = true;
StringBuilder query = new StringBuilder("from StockDailyRecord ");
if(startDate!=null){
if(isFirst){
query.append(" where date >= '" + sdf.format(startDate) + "'");
}else{
query.append(" and date >= '" + sdf.format(startDate) + "'");
}
isFirst = false;
}
if(endDate!=null){
if(isFirst){
query.append(" where date <= '" + sdf.format(endDate) + "'");
}else{
query.append(" and date <= '" + sdf.format(endDate) + "'");
}
isFirst = false;
}
if(volume!=null){
if(isFirst){
query.append(" where volume >= " + volume);
}else{
query.append(" and volume >= " + volume);
}
isFirst = false;
}
query.append(" order by date");
Query result = session.createQuery(query.toString());
return result.list();
}
2.基準の例
Criteriaでは、これが ‘where’構文を追加する最初の基準であるかどうかを比較する必要はなく、日付もフォーマットする必要はありません。コード行は縮小され、すべてがよりエレガントでオブジェクト指向の方法で処理されます。
public static List getStockDailyRecordCriteria(Date startDate,Date endDate,
Long volume,Session session){
Criteria criteria = session.createCriteria(StockDailyRecord.class);
if(startDate!=null){
criteria.add(Expression.ge("date",startDate));
}
if(endDate!=null){
criteria.add(Expression.le("date",endDate));
}
if(volume!=null){
criteria.add(Expression.ge("volume",volume));
}
criteria.addOrder(Order.asc("date"));
return criteria.list();
}
Criteria API
一般的なCriteria API関数をいくつか試してみましょう。
1.基準の基本的な質問
基準オブジェクトを作成し、データベースからすべての ‘StockDailyRecord’レコードを取得します。
Criteria criteria = session.createCriteria(StockDailyRecord.class);
2.条件照会の基準
結果は「日付」で昇順にソートされます。
Criteria criteria = session.createCriteria(StockDailyRecord.class)
.addOrder( Order.asc("date") );
結果は降順で ‘日付’でソートされます。
Criteria criteria = session.createCriteria(StockDailyRecord.class)
.addOrder( Order.desc("date") );
3.クライテリア制限のクエリ
Restrictionsクラスは、比較操作を行うための多くのメソッドを提供します。
Restrictions.eq
valumeが10000であることを確認してください。
Criteria criteria = session.createCriteria(StockDailyRecord.class)
.add(Restrictions.eq("volume", 10000));
制限.lt、le、gt、ge
音量が10000未満であることを確認します。
Criteria criteria = session.createCriteria(StockDailyRecord.class)
.add(Restrictions.lt("volume", 10000));
音量が10000以下であることを確認してください。
Criteria criteria = session.createCriteria(StockDailyRecord.class)
.add(Restrictions.le("volume", 10000));
音量が10000を超えることを確認してください。
Criteria criteria = session.createCriteria(StockDailyRecord.class)
.add(Restrictions.gt("volume", 10000));
音量が10000以上であることを確認してください。
Criteria criteria = session.createCriteria(StockDailyRecord.class)
.add(Restrictions.ge("volume", 10000));
制限
株式名が「MKYONG」で始まり、任意の文字が続くことを確認してください。
Criteria criteria = session.createCriteria(StockDailyRecord.class)
.add(Restrictions.like("stockName", "MKYONG%"));
制限事項
日付が開始日と終了日の間であることを確認してください。
Criteria criteria = session.createCriteria(StockDailyRecord.class)
.add(Restrictions.between("date", startDate, endDate));
Restrictions.isNull、isNotNull
ボリュームがヌルであることを確認します。
Criteria criteria = session.createCriteria(StockDailyRecord.class)
.add(Restrictions.isNull("volume"));
ボリュームがヌルでないことを確認します。
Criteria criteria = session.createCriteria(StockDailyRecord.class)
.add(Restrictions.isNotNull("volume"));
3.結果をページングする基準
条件には、ページネーションを非常に簡単にするための機能はほとんどありません。
20番目のレコードから開始し、データベースから次の10個のレコードを取得します。
Criteria criteria = session.createCriteria(StockDailyRecord.class); criteria.setMaxResults(10); criteria.setFirstResult(20);
なぜ基準がないのですか?
Criteria APIにはいくつかの欠点があります。
1.パフォーマンスの問題
生成されたクエリが遅い場合、クエリを調整するのが非常に難しく、データベース管理者がそれを気に入らない場合、Hibernateによって生成されたSQLクエリを制御する方法がありません。
1.メンテナンスの問題
すべてのSQL照会はJavaコードを介して分散されています。照会が間違っていると、アプリケーション内で問題照会を見つけるのに時間がかかることがあります。一方、Hibernateマッピングファイルに格納されている名前付きクエリは、保守がずっと簡単です。