mybatis Map<String,Object>params 传参 0 与 判断条件 !='' 问题
2018-01-18 10:59
906 查看
最近刚刚接触mybatis,遇到一个坑,记录一下。
在调用mybatis的sqlSession对象传递参数,且参数类型为Map<String,Object>时,
map.put('condition1',0)——情形1
map.put('condition1','0')——情形2
在配置文件中,
<test="condition1 != '' ">
情形1下返回结果为false,即 0 与 '' 相等
情形2下返回结果为true,即'0'与''不相等
个人看来,应该情形1与2都返回true,即0、'0'应该与''均不相等才对,跟了源码,才明白个中原因。
最终跟进代码为OgnlOps类下的compareWithConversion方法
情形2下,String比较,自然不等
总结,根据传递的参数类型,向上转换,确实也说得过去。
总之,是自己遇到的问题,需要注意
在调用mybatis的sqlSession对象传递参数,且参数类型为Map<String,Object>时,
map.put('condition1',0)——情形1
map.put('condition1','0')——情形2
在配置文件中,
<test="condition1 != '' ">
情形1下返回结果为false,即 0 与 '' 相等
情形2下返回结果为true,即'0'与''不相等
个人看来,应该情形1与2都返回true,即0、'0'应该与''均不相等才对,跟了源码,才明白个中原因。
最终跟进代码为OgnlOps类下的compareWithConversion方法
public static int compareWithConversion(Object v1, Object v2, boolean equals) { int result; if (v1 == v2) { result = 0; } else { int t1 = getNumericType(v1); int t2 = getNumericType(v2); int type = getNumericType(t1, t2, true); switch(type) { case 6: result = bigIntValue(v1).compareTo(bigIntValue(v2)); break; case 9: result = bigDecValue(v1).compareTo(bigDecValue(v2)); break; case 10: if (t1 == 10 && t2 == 10) { if (v1 != null && v2 != null) { if (v1.getClass().isAssignableFrom(v2.getClass()) || v2.getClass().isAssignableFrom(v1.getClass())) { if (v1 instanceof Comparable) { result = ((Comparable)v1).compareTo(v2); break; } if (equals) { result = v1.equals(v2) ? 0 : 1; break; } } if (!equals) { throw new IllegalArgumentException("invalid comparison: " + v1.getClass().getName() + " and " + v2.getClass().getName()); } result = 1; break; } else { boolean var10000 = v1 != v2; } } case 7: case 8: double dv1 = doubleValue(v1); double dv2 = doubleValue(v2); return dv1 == dv2 ? 0 : (dv1 < dv2 ? -1 : 1); default: long lv1 = longValue(v1); long lv2 = longValue(v2); return lv1 == lv2 ? 0 : (lv1 < lv2 ? -1 : 1); } } return result; }情形1下,都转变成double 0.0故相等
情形2下,String比较,自然不等
总结,根据传递的参数类型,向上转换,确实也说得过去。
总之,是自己遇到的问题,需要注意
相关文章推荐
- 【问题解决】Redis存储Hash-Map<String,Object>时无法序列化问题
- mybatis返回Map<String, Object>
- Mybatis无实体类,以List<Map<String,Object>>方式返回
- 获取List<Map<String,Object>> list中的值得问题
- MyBatis 判断条件为等于的问题(<if test="type == '1'.toString()"> xxx </if>
- Mybatis 如何 返回 List<String> 类型 或 List<Map<String,Object>>类型
- 笔记 freemark list标签迭代Map<Map<String,Object>集合排序问题
- Mongo的morphia读取Map<String, List<Object>>类型数据的问题
- Gson 反序列化Map<String, Object>类型的小问题
- mybatis返回List<Map<String,Object>>
- 如何判断Map<String, Object>为空?
- 当mapper中的parametType为基本类型(如int,string等)时,报错的问题(mybatis使用了<if>判断)
- 行专列,拆分json,实现数据的展示。Map<String, Object>存储多个相同的key,List<Map<String, Object>>
- 关于List<Map<String,Object>>的通俗解释
- list中依据map<String,Object>的某个值排序
- List<Map<String,Object>>集合根据map里面的一个字段排序
- 对List<Map<String, Object>>集合排序
- List<Map<String, Object>> 转换成JSON数据格式保存再转List<Map<String, Object>> 返回
- Map<String, Object> session=ActionContext.getContext().getSession()
- 遍历List<Map<String, Object>>