您的位置:首页 > 移动开发 > Objective-C

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方法
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比较,自然不等

总结,根据传递的参数类型,向上转换,确实也说得过去。
总之,是自己遇到的问题,需要注意
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mybatis