Parameter list not found错误?3分钟修复Available parameters are [list],Parameter list not found错误快速修复指南
半夜调试代码又双叒卡在Parameter 'list' not found
?🤯 这破报错气得我差点把键盘砸了——明明传了List参数,MyBatis偏说找不到!
一、揪出元凶:MyBatis的“潜规则”
MyBatis有个反直觉设计:直接传List参数时,它会被偷偷包装成Map,但键名不是你的参数名,而是固定叫list
或collection
。
举个作 *** 案例:
![Parameter list not found错误?3分钟修复Available parameters are [list],Parameter found错误快速修复指南 第1张 Parameter list not found错误?3分钟修复Available parameters are [list],Parameter found错误快速修复指南 第1张](/d/file/zixun/20250812/hdghwsdbmza.jpg)
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"
!
翻遍源码才发现:这其实是早期设计遗留的妥协方案。
所以别怀疑自己——不是你的错,是框架的锅!