またしてもMyBatisがやってくれやがった
前回に引き続き、またしてもMyBatisのヘンテコな動きにハマったという話です。
とは言うものの、基本的に私自身がおっちょこちょいなのと、どう考えても間違えたやつが悪い案件なので
MyBatisは何も悪くないと思います(いや、やっぱ悪いと思う)
意外と自分自身では間違いを見つけられずに、無駄な時間を過ごしてしまうって事が
まれによくあると思うのでいつか誰かが同じようなことで悩んだときにすぐに解決できるように残しておきます
MyBatisのバージョンは3.2です。
発生したこと
DBのNUMERIC
なカラムに対して、JavaのInteger
で保持しているデータが何故か入らなかった。
(実際に吐き出されたエラーをとっていなかったので、後でちゃんと貼り付けます!)
たしか、
String
なデータをNUMERIC
なカラムに入れるなら、明示的にCASTしてね!
というようなエラー内容だったと思う。
え?なんでString
?僕が持っているの、Integer
なんですけど・・・・?という内容です。
※ 以下のソースは、フィーリングを伝えるためのクソコードです。
変数名とかメソッド名とかすごい適当です
// 諸々省略
...
...
...
List<Integer> itemMasterIds = itemMasterMapper.getIdsByCategoryName("タピオカ");
// ↓↓ここでエラーになる↓↓
userItemsMapper.add(user.getId(), itemMasterIds);
List<Integer> getIdsByCategoryName(@Param("categoryName") String categoryName);
<select id="getIdsByCategoryName" resultType="string">
SELECT item_master_id FROM item_master WHERE category = #{categoryName}
</select>
void add(@Param("userId") long userId, @Param("itemMasterIds") List<Integer> itemMasterIds);
<insert id="add">
INSERT INTO user_items (user_id, item_master_id)
VALUES
<foreach collection="itemMasterIds" item="item" separator=",">
(#{userId}, #{item})
</foreach>
</insert>
原因
おそらく、大体の人はざっと上記のコードを見ただけで瞬時にわかっちゃうと思うんですが、
ItemMasterMapper.xml
でgetIdsByItemCategory
のresultType
を、
string
って書いちゃってるんですね。
<select id="getIdsByItemCategory" resultType="string">
普通なら、Mapperインタフェースに定義した戻り値の型と、
Mapper XMLで定義しているresultType
が不一致だった場合は、
その時点でエラーになると思うんですが、なぜかitem_master.item_master_id
が
String
のList
で取れちゃうんですよねこれが・・・・。
この程度のエラーがすぐに見つけられないとか、もう限界ですわ