忍者ブログ
[211] [210] [209] [208] [207] [206] [205] [204] [203] [202] [201]

DATE : 2024/03/19 (Tue)
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


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以前の方法で書かれているので注意が必要です。

(;^ω^)見事にひっかかりました

参考文献

PR
●この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
●この記事へのトラックバック
この記事にトラックバックする:
忍者ブログ [PR]
ブログ内検索
最近の状況
リンク
カレンダー
02 2024/03 04
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック
ブログ内検索
最近の状況
リンク
カレンダー
02 2024/03 04
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック