詳細まで追っかけてないけど現象としてメモ。

iBatisで結果をObjectで受け取る場合は、特に指定が無ければiBatis側で勝手に適当な型にいれてくれる。
#この型の決め方を本当なら調べればいいんだろうけど面倒くさくて調べてない。

たとえばMySQLで、MEMBERテーブルのMEMBER_IDというカラムがint(10) unsignedとかだった場合、
Java側ではまあ一応longで受け取りたいところ。

iBatisのResultMapで

<resultMap id="member" class="java.util.HashMap">
<result column="MEMBER_ID" property="memberId"/>
</resultMap>
<select id="memberId" resultMap="member">
SELECT MEMBER_ID FROM MEMBER
</select>

みたいな感じで指定してやって、結果をMapで受け取るってのはよくある形だと思うんだけど、上の例で受け取ったものを

Map result = dao.select();
Long memberId = (Long) result.get("memberId");

みたいにするとちゃんとLongで取れちゃう。逆にIntegerでキャストするとClassCastException。
まあこれは期待する挙動なので問題ない。

ところが。
上の例でのMEMBER_IDがint(11)で定義されたカラムだった場合、
上記のようにLongで受けるとClassCastExceptionになる。
インスタンスはIntegerの形で返ってくる。

じゃあどーすんのよ?つったときには簡単。
iBatisのResultMapにJavaでの型を明示する。

<resultMap id="member" class="java.util.HashMap">
<result column="MEMBER_ID" property="memberId" javaType="long"/>
</resultMap>
<select id="memberId" resultMap="member">
SELECT MEMBER_ID FROM MEMBER
</select>

この現象の理由はiBatisが型解決をどう実装してんのかなーって妄想すると
いくつか思い浮かんでくるけども調べてない故に確証がないので書かない。