Home > 2009年06月

2009年06月

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • Comments (Close): -
  • TrackBack (Close): -

COUNT関数とClassCastException

  • 2009-06-29 (Mon)
  • Java

バーボンです。最近のブームはClassCastExceptionです。
PostgresDBアクセス時、COUNT関数を使って得られた結果をList<Object>()に入れ、 後に値をInteger型にしようとしたときのことです。

*流したSQL
SELECT blood_type, COUNT(*) FROM staff 
GROUP BY blood_type 
ORDER BY blood_type
たとえばこんな感じで
List<Object> bloodCountList = staffDao.countBloodGroup();
Map<BloodGroup, Integer> bloodCountMap 
    = new LinkedHashMap<BloodGroup, Integer>();

for (Iterator i=bloodCountList.iterator(); i.hasNext();) {
    listElement = (Object[])i.next();
    bloodCountMap.put((BloodGroup)listElement[0], (Integer)listElement[1]);
}
…

これを実行するとjava.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integerというエラーが出ました。Longを使った覚えがないので調べてみたところ

1.COUNT関数の戻り値(Postgres,Oracle)のデフォルトはbigint型というデータ型で、整数の記録のため8バイトの領域が割り当てられるものである。そして、コンパイル時の対応するJavaの型はjava.lang.Long→エラーのLong型の正体。

そうするとこのままLong型をInteger型にするしかなさそうです。

2.Long型→Integer型への変換は、Long,Integerの親である、Numberクラスにbyte, double, float, int, long, short型のそれぞれにキャストできるメソッドがあるので、今回はその中のintValue()を使います。(Integerというかint型にしてます。JDK1.5以降の恩恵により、int→Integerの変換はAutoBoxingしてもらいます。)

http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Number.html

java.lang.Object

-java.lang.Number

-java.lang.Integer

直してキャストしてみます。

bloodCountMap.put((BloodGroup)listElement[0], ((Number)listElement[1]).intValue());

これを実行するとエラーは消えました。

Home > 2009年06月

Recent Comments
Recent Trackback
Search
Meta
Links
Feeds

Page Top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。