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

MyBatis中HashMap嵌套参数取值异常问题排查

问题原因及解决办法

核心问题:OGNL表达式访问Map元素的方式错误

MyBatis使用OGNL解析XML中的表达式,不能直接用Java的get()方法访问Map元素,得用OGNL专属的Map访问语法。同时要确保Filter类的字段能被MyBatis正确读取。

具体问题点及修复步骤:

  1. <if>标签中的判断表达式错误
    原代码中myFilter.myMap.get('key1')不符合OGNL语法,应改为myFilter.myMap['key1']或者myFilter.myMap.key1(当键名是合法标识符时)。

  2. #{}中的参数引用错误
    同样,#{myFilter.myMap.get('key1')}写法错误,要换成#{myFilter.myMap['key1']}或者#{myFilter.myMap.key1}。

  3. Filter类的字段访问权限问题
    你定义的Filter类字段是默认包私有,如果Mapper接口和Filter不在同一个包下,MyBatis无法直接访问这些字段。正确做法是给字段添加getter方法(符合Java规范),或者将字段改为公有。

修复后的代码示例:

第一步:给Filter类添加getter方法

class Filter {
    String str;
    HashMap<String,String> myMap;

    public String getStr() {
        return str;
    }

    public HashMap<String, String> getMyMap() {
        return myMap;
    }
}

第二步:修改Mapper XML中的表达式

<select id="select" resultMap="RM">
  SELECT ... FROM .... 
  WHERE id=#{myFilter.str} 
  <if test="myFilter != null and myFilter.myMap != null and myFilter.myMap['key1'] != null">
    AND code = #{myFilter.myMap['key1']}
  </if>
</select>

额外验证建议

开启MyBatis的SQL日志打印,查看最终生成的SQL语句,确认条件是否正确拼接。比如在Spring环境的application.yml中添加:

mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

这样就能直接看到执行的SQL,判断AND code = ?是否被正确添加,以及占位符的值是否符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:32:43