Hibernate便利なんだけど、エンティティ(データ本体)だけじゃなくて
データを分析した統計データを使用したいこともDBを使用したシステムなら多々ある。
Hibernateは時間に関係する関数がまったく無いからこのあたりが不便でならない。
という感想はかなりの人が持っていると思うのですがどうでしょうか?
Hibernate3でネイティブなSQLを使いまわす方法(createSQLQueryの用法)を紹介します。
よく紹介されているエンティティを取り出す方法ではなくて
統計データ等(マップされていないデータ)を取り出す方法です。
Hibernate3より前のバージョンでは関数の使い方が違うので要注意。
例1)
SQLQuery query = session.createSQLQuery("select distinct DATE_FORMAT(log.access_time,'%Y-%m-01') month from access_log log order by month desc");
query.addScalar("month",new org.hibernate.type.DateType());
List month_list = query.list();
上の例では架空のアクセスログテーブルに対してアクセスのある月を重複無しで取り出している。
ポイントは2行目addScalarのあたり、マップされていないデータの扱い方を通知する。
ちょっとトリッキーに返すデータの形式をStringからDate型に整形してマップしてみた。
month_listには java.sql.Date が格納されている。
例2)
SQLQuery query = session.createSQLQuery("select distinct DATE_FORMAT(log.access_time,'%Y-%m-01') month,DATE_FORMAT(log.access_time,'%D') day from access_log log order by month desc,day desc");
query.addScalar("month",new org.hibernate.type.DateType());
query.addScalar("day",new org.hibernate.type.IntegerType());
List date_list = query.list();
複数のデータを返すSQLの例
date_listには Object[] が格納されている。
Object[0] が java.sql.Date (例1と同じ値)に対応し Object[1]が日付値の Integerとなる。
注:MySQL使用…方言多様(?)
参考
http://www.powerdee.com/it/hibernate/hibernateQuery.html
http://www.hibernate.org/250.html
最近のコメント