Parameter list not found错误?3分钟修复Available parameters are [list],Parameter list not found错误快速修复指南

半夜调试代码又双叒卡在Parameter 'list' not found?🤯 这破报错气得我差点把键盘砸了——​​明明传了List参数,MyBatis偏说找不到​​!

一、揪出元凶:MyBatis的“潜规则”

MyBatis有个反直觉设计:​​直接传List参数时,它会被偷偷包装成Map​​,但键名不是你的参数名,而是固定叫listcollection

举个作 *** 案例:

Parameter list not found错误?3分钟修复Available parameters are [list],Parameter found错误快速修复指南  第1张
java下载复制运行
// DAO层方法  List selectUsers(List idList);
xml复制
<foreach collection="idList" item="id"> ❌#{id}foreach>

报错信息会冷笑:Available parameters are [list]

💡 ​​个人暴论​​:这设计简直是坑新手专用——​​凭什么我参数叫idList,XML里非得写collection="list"?​


二、3种解法,亲测能救急

▸ 方案1:向“潜规则”低头

直接按MyBatis的规矩来:

xml复制
<foreach collection="list" item="id"> ✅#{id}foreach>

适用场景:​​不想改Java代码​​的摆烂时刻

▸ 方案2:@Param注解硬刚

给参数起个名,逼MyBatis认账:

java下载复制运行
// DAO层加@Param  List selectUsers(@Param("myIds") List idList);
xml复制
<foreach collection="myIds" item="id"> ✅#{id}foreach>

👉 ​​这才是符合人类直觉的写法!​

▸ 方案3:对象封装术

遇到​​多个参数+List混合​​时,建个包装对象:

java下载复制运行
@Datapublic class QueryParam {private List idList;private String type;}// DAO层直接传对象  List selectUsers(QueryParam param);
xml复制
<foreach collection="param.idList" item="id"> ✅#{id}foreach>

优势:​​避免@Param注解满天飞​


三、企业级避坑指南

1. 数组参数别踩雷

传数组时键名不是list而是array

xml复制
<foreach collection="array" item="id">

2. 嵌套 *** 要当心

List套对象时,属性要用.表达式:

xml复制
<foreach collection="list" item="user">#{user.id}foreach>

3. 动态SQL的隐藏BUG

标签内引用 *** 时,​​必须用@Param别名​​:

xml复制
<if test="myIds != null and myIds.size()>0">

否则报Parameter 'list' not found给你看!


四、为什么你该弃用默认规则?

实测数据说话:

  • ​团队协作灾难​​:新人接手老代码,发现XML里全是collection="list",根本不知道对应哪个参数😤

  • ​重构风险​​:把List参数改成Set?👉 所有XML里的list都得手动改成collection

  • ​可读性毒药​​:看到collection="list",你能想到它其实是订单ID列表?

​独家建议​​:​​所有 *** 参数强制加@Param​​!虽然多写几个字,但省下查错2小时不香吗?


五、说个细思极恐的真相

MyBatis *** 文档​​从没明确推荐​​直接用collection="list"

翻遍源码才发现:这其实是​​早期设计遗留的妥协方案​​。

所以别怀疑自己——​​不是你的错,是框架的锅!​