MyBatisのforeachでハマった件
MyBatisの<foreach>
を利用して、複数データのバルクINSERTしようと思ったのですが
何故かこんなエラーが発生。
MyBatisのバージョンは3.2です。
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter '__frch_item_0' not found. Available parameters are [addItems, param1]
実装
ItemMasterMapper.java
void addItems(@Param("addItems") List<Item> addItems);
ItemMasterMapper.xml
<insert id="addItems">
INSERT INTO item_master(name, price, option) VALUES
<foreach item="item" collection="addItems" separator=",">
(#{item.name}, #{item.price}, #{item.option})
</foreach>
</insert>
Item.java
public class Item {
private String name;
private long price;
// ~~~以下setterやgetterは省略~~~
}
この程度のものがなんで??エラーの内容的に、@Param
で指定したパラメーター名のtypoなのか?
それとも使っているMyBatisが古すぎて、バルクインサートに対応していないのか?
とひたすらエラーメッセージをググって探しました。
原因
よく見てみると、Item
クラスにoption
が定義されていません。
Item.java
public class Item {
private String name;
private long price;
// ↓ これが抜けていた
private String option;
// ~~~以下setterやgetterは省略~~~
}
Mapper XMLに記載した変数名と、実際のモデルクラスのメンバ変数の不一致が
<foreach>
タグの内部で起きていたことで
'__frch_item_0' not found
なんていうエラーが発生してしまったようです。
なぜここで、突然item
の存在が無かったことになるのか・・・・
そこは普通にoptionがないよ
って教えてくれたらいいのに・・・
僕の1時間半返して・・・・