You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MyBatis使用<foreach>遍历Map时触发TypeException问题求助

问题原因

你在<foreach>里用#{key}是错误的。#{}是预编译参数占位符,MyBatis会把它转换成SQL的?,然后尝试从参数中找对应的值。但这里的key是Map的键(也就是数据库列名),并不是传入的参数值,MyBatis会自动生成__frch_key_xx这类参数名,而你的参数里根本没有这些值,所以触发了参数绑定失败,出现Invalid parameter index错误。

直接写目标SQL时列名是硬编码的,不存在参数绑定环节,所以能正常运行。

修复方案

把#{key}改成${key},${}是直接字符串替换,会把Map的键直接拼到SQL里,不会当作预编译参数处理。修改后的代码如下:

select * from ${tableName} where
<foreach collection="dataMap.entrySet()" item="value" index="key" open=" " separator=" and " close="">
    ${key} = #{value}
</foreach>
额外提醒
  • 用${key}拼接列名时,必须保证dataMap的键都是合法的数据库列名,同时要做好SQL注入防护(比如列名用白名单校验,禁止用户随意输入列名)。
  • 如果dataMap可能为空,要额外处理,避免生成where后无条件的SQL(比如加<if test="dataMap != null and !dataMap.isEmpty()">包裹where和foreach块)。

内容的提问来源于stack exchange,提问作者farmerbenny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 00:22:10