最近刚刚接触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方法情形1下,都转变成double 0.0故相等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; }
情形2下,String比较,自然不等
总结,根据传递的参数类型,向上转换,确实也说得过去。
总之,是自己遇到的问题,需要注意