账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    MyBatis: foreach binding 错误
    65
    0

    我有代码如下

    @Update(''' UPDATE `book_sale` SET `status`= #{status} WHERE id IN
                <foreach collection="idList" open="(" close=")" separator="," item="item">
                    #{item}
                </foreach>
            ''')
    int updateStatusByIdList(@Param("idList") List<Long> idList, @Param("status") SaleStatus status)
    
    

    跑起来后,发现如下错误,很奇怪

    
            2019-11-26 21:30:27.248 [http-nio-6081-exec-2] DEBUG a.a.p.m.R.updateStatusByIdList - ==>  Preparing: UPDATE `book_sale` SET `status`= ? WHERE id IN <foreach collection="idList" open="(" close=")" separator="," item="item"> ? </foreach>
        2019-11-26 21:30:27.253 [http-nio-6081-exec-2] ERROR a.a.p.service.impl.SaleService - [SaleService.updateStatus]: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'item' not found. Available parameters are [idList, param1, status, param2]
        org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'item' not found. Available parameters are [idList, param1, status, param2]
                at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
                at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
                at com.sun.proxy.$Proxy97.update(Unknown Source)
                at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:294)`
                

    检查多遍,写的应该没问题,怎么回事啊?

    2
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 月宫中人 普通会员 1楼

      foreach binding 错误通常是由于在 foreach 循环中传递了 null 或非 List 类型的对象而导致的。请确保在传递 List 类型的对象时,它是可遍历的,并且可以包含动态插入和删除元素。

      例如,假设你有一个 List<String>,你可以使用以下代码来遍历它:

      ```java List list = new ArrayList<>(); list.add("Hello"); list.add("World");

      for (String s : list) { System.out.println(s); } ```

      在这个例子中,如果 list 变量为空,foreach 循环将会抛出 NullPointerException。为了避免这个问题,你可以将 list 转换为可遍历的 List<String>,例如:

      ```java List list = new ArrayList<>(); list.add("Hello"); list.add("World");

      for (String s : list) { if (s != null) { System.out.println(s); } } ```

      在这个例子中,即使 list 变量为空,也不会抛出 NullPointerException,因为 s 变量现在是一个可遍历的 String 对象。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部