0
0

More than 3 years have passed since last update.

MyBatisのMapperXMLでresultTypeが珍妙な動きをした

Last updated at Posted at 2019-11-22

またしてもMyBatisがやってくれやがった

前回に引き続き、またしてもMyBatisのヘンテコな動きにハマったという話です。
とは言うものの、基本的に私自身がおっちょこちょいなのと、どう考えても間違えたやつが悪い案件なので
MyBatisは何も悪くないと思います(いや、やっぱ悪いと思う)
意外と自分自身では間違いを見つけられずに、無駄な時間を過ごしてしまうって事が
まれによくあると思うのでいつか誰かが同じようなことで悩んだときにすぐに解決できるように残しておきます

MyBatisのバージョンは3.2です。

発生したこと

DBのNUMERICなカラムに対して、JavaのIntegerで保持しているデータが何故か入らなかった。
(実際に吐き出されたエラーをとっていなかったので、後でちゃんと貼り付けます!)
たしか、

StringなデータをNUMERICなカラムに入れるなら、明示的にCASTしてね!

というようなエラー内容だったと思う。

え?なんでString?僕が持っているの、Integerなんですけど・・・・?という内容です。

※ 以下のソースは、フィーリングを伝えるためのクソコードです。
変数名とかメソッド名とかすごい適当です

ItemService.java
// 諸々省略
...
...
...
List<Integer> itemMasterIds = itemMasterMapper.getIdsByCategoryName("タピオカ");
// ↓↓ここでエラーになる↓↓
userItemsMapper.add(user.getId(), itemMasterIds);
ItemMasterMapper.java
List<Integer> getIdsByCategoryName(@Param("categoryName") String categoryName);
ItemMasterMapper.xml
<select id="getIdsByCategoryName" resultType="string">
    SELECT item_master_id FROM item_master WHERE category = #{categoryName}
</select>
UserItemsMapper.java
void add(@Param("userId") long userId, @Param("itemMasterIds") List<Integer> itemMasterIds); 
UserItemsMapper.xml
<insert id="add">
    INSERT INTO user_items (user_id, item_master_id)
    VALUES
    <foreach collection="itemMasterIds" item="item" separator=",">
    (#{userId}, #{item})
    </foreach>
</insert>

原因

おそらく、大体の人はざっと上記のコードを見ただけで瞬時にわかっちゃうと思うんですが、
ItemMasterMapper.xmlgetIdsByItemCategoryresultTypeを、
stringって書いちゃってるんですね。

<select id="getIdsByItemCategory" resultType="string">

普通なら、Mapperインタフェースに定義した戻り値の型と、
Mapper XMLで定義しているresultTypeが不一致だった場合は、
その時点でエラーになると思うんですが、なぜかitem_master.item_master_id
StringListで取れちゃうんですよねこれが・・・・。

この程度のエラーがすぐに見つけられないとか、もう限界ですわ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0