BindingException: Parameter ‘ids‘ not found. Available parameters are [collection, list]

记录没见过的Bug之BindingException

今天在写一个删除套餐功能时遇到个bug如下图所示:

我们都知道当一个请求参数有多个值接收时可以采用如下方式:
               1. 使用数组接收   Long[] ids
               2. 使用集合接收  List<Long> ids  注意: 如果使用集合需要添加@RequestParam

这里我采用的是以集合方式来接收。

在Mapper接口中的方法如下

     //动态sql
    long findCountByIds(List<Long> ids);
    //根据ids批量删除的套餐
    void deleteByIds(List<Long> ids);

xml的sql语句如下:

    <!-- 为了提高sql语句的复用性,可以使用sql标签抽取出来-->
    <sql id="foreachSql">
        <foreach collection="ids"  item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </sql>

    <!--  //查询在售套餐的个数
      long findCountByIds(List<Long> ids);-->
    <select id="findCountByIds" resultType="long">
        SELECT COUNT(*) FROM setmeal WHERE STATUS=1 AND id IN
        <include refid="foreachSql"></include>
    </select>

    <!--//根据ids批量删除的套餐
    void deleteByIds(List<Long> ids);-->
    <delete id="deleteByIds">
        delete from setmeal where id in
        <include refid="foreachSql"></include>
    </delete>

一切都看着那么的岁月静好,但最后运行却报错了。。。

分析原因:

原来在mybatis 中,当 Mapper传入的是 List 参数时,会自动将参数封装成 Map 参数,而 map中的 key 会自动用 list , value 就是你传入的 List 参数。

解决方法:

        第一种: 将 List 参数封装为 Map 然后再传入,在 XML 配置页面写上相应 key 值.
        第二种: 将 collection 的值修改为 list

 这样报错就解决啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值