MyBatis中HashMap嵌套参数取值异常问题排查
问题原因及解决办法
核心问题:OGNL表达式访问Map元素的方式错误
MyBatis使用OGNL解析XML中的表达式,不能直接用Java的get()方法访问Map元素,得用OGNL专属的Map访问语法。同时要确保Filter类的字段能被MyBatis正确读取。
具体问题点及修复步骤:
<if>标签中的判断表达式错误
原代码中myFilter.myMap.get('key1')不符合OGNL语法,应改为myFilter.myMap['key1']或者myFilter.myMap.key1(当键名是合法标识符时)。#{}中的参数引用错误
同样,#{myFilter.myMap.get('key1')}写法错误,要换成#{myFilter.myMap['key1']}或者#{myFilter.myMap.key1}。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
相关产品推荐
相关产品推荐

