category: Java
DATE : 2006/11/18 (Sat)
DATE : 2006/11/18 (Sat)
Hibernate 3.1 までは、データの件数を取得する処理は次のように書けました。(以下は、Cat クラスの全オブジェクトの件数を取得する処理です。)
int catCount = (Integer) session.iterate( "select count(*) from Cat").next();
しかし、Hibernate 3.2 からは、HQL の count 関数は Long 型を返すようになりました。つまり、以下のように書き直さなければなりません。
long catCount = (Long) session.iterate( "select count(*) from Cat").next();
この変更は、Java Persistence API に準拠するために行われたようです。そのため、Hibernate 3.2 以降で結果を Integer で取得しようとすると ClassCastException が発生します。
ただし、org.hibernate.cfg.Configuration を次のように設定すると、3.2 以降でも Integer で取り出すことができます。
configuration.addSqlFunction("count", new ClassicCountFunction());
なお、count 関数以外にも、sum や avg なども戻り値が変更されています。sum は、元々は合計された型そのものが返されていましたが、
- Long 以下の整数型であれば Long
- 浮動小数点数であれば Double
- BigInteger や BigDecimal であればその型
と変わりました。また、avg は フィールドの型に依存していたものが、Double が返されるように変わりました。
sum や avg も含めて 3.1 以前の書き方を適用する場合は、次のように Configuration を設定します。
configuration.addSqlFunction("count", new ClassicCountFunction()); configuration.addSqlFunction("avg", new ClassicAvgFunction()); configuration.addSqlFunction("sum", new ClassicSumFunction());
ちなみに今のところ、Hibernate 3.2.0ga のドキュメントは3.1以前の方法で書かれているので注意が必要です。
(;^ω^)見事にひっかかりました
参考文献
- Hibernate3 Migration Guide - Hibernate 3.2 - Query language changes - Changed aggregation (count, sum, avg) function return types
- [HHH-1538] aggregations functions in EJBQL queries does not return the appropriate types - Hibernate JIRA
PR
●この記事にコメントする
忍者ブログ [PR]