1.1 问题描述
才疏学浅,今天在写一个sql
语句时,用到了if判断,但是执行结果不是我想要的,遂记录这次的bug
,供大家参考。
上述表达,当传入参数validCoupon
的值为“1”
时,仍然不能执行if
判断下的sql
语句。
1.2 剖析原因
public class ExpressionEvaluator {
public boolean evaluateBoolean(String expression, Object parameterObject) {
bject value = OgnlCache.getValue(expression, parameterObject);
if (value instanceof Boolean) return (Boolean) value;
if (value instanceof Number) return !new BigDecimal(String.valueOf(value)).equals(BigDecimal.ZERO);
return value != null;
}
上述代码是mybatis
递归if
条件,拼接sql
的源码,使用了OGNL
表达式,而传入的‘1’
会被解析成字符类型,在java
中,Char
和String
方然是不一样的,返回false
。
1.3 问题解决
-
第一种就是将
Char
类型转化成String
类型,<if test="validCoupon == '1'.toString() ">
-
第二种就是直接传入时就是
String
类型,<if test=' validCoupon == "1" '>