0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MyBatisのforeachエラーに悩まされた

Last updated at Posted at 2019-11-21

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時間半返して・・・・

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?