解决方法

第一种解决方法:

<if test="isExpired=='Y'">
and msg.expire_time &lt; now()
</if>
会报NumberFormatException,这样就可以了。
<if test="isExpired=='Y'.toString()">
and msg.expire_time &lt; now()
</if>

第二种解决方法

<if test=" name=='你好' ">
 
<if>
 
这样会有问题,换成
 
<if test=' name=="你好" '>
 
<if>

实际用到的地方是这样的
当一个条件既要用到等于又要用到>等判断的时候这样做

  <if test="_parameter.containsKey('colNum') and colNum!='6'.toString()" >
            and a.col_num = #{colNum}
        </if>
 <if test="_parameter.containsKey('colNum') and colNum =='6'.toString()" >
            and (a.col_num+0) > 5
        </if>

非常方便
如果用<号 会冲突和<if,是这样解决的

  <![CDATA[<if test="_parameter.containsKey('sendAreaName')" >
            and a.send_area_name <#{sendAreaName} 
        </if>]]>


研究探究:

mybatis 动态sql 中if判断使用的ognl表达式,现在分3中情况说明并验证。

一、情况说明:

传入的itemCode为参数传入mybatis

<if test='itemCode != null and itemCode !=""  and itemCode =="xxx" '>

1、 单个字符的数字型字符串
例如:传入参数 itemCode=“1”
以下写法不符合判断

<if test="itemCode != null and itemCode !=''  and itemCode =='1'.toString()"><if test='itemCode != null and itemCode !=""  and itemCode =="1" '>

2、单个字符的非数字型字符串
例如:传入参数 itemCode=“z”

<if test="itemCode != null and itemCode !=''  and itemCode =='z'">

会报错 NumberFormatException,如果想让判断符合条件如下写法。

<if test="itemCode != null and itemCode !=''  and itemCode =='z'.toString()"><if test='itemCode != null and itemCode !=""  and itemCode =="z" '>

3、不是单个字符的字符串
例如:传入参数 itemCode=“张三”
不用.toString()或单引号变双引号就会符合条件

<if test="itemCode != null and itemCode !=''  and itemCode =='张三'">

二、验证代码

1.添加依赖

 <dependency>
            <groupId>ognl</groupId>
            <artifactId>ognl</artifactId>
            <version>2.6.9</version>
        </dependency>

2.代码示例

public class TestOgnl {
    public static void main(String[] args) throws Exception {
        Map<String, Object> context = new HashMap<String, Object>();
        context.put("id", "1");
        context.put("name", "z");
        context.put("sex", "man");
        System.out.println(context);
        // 单个字符的数字型字符串
        System.out.println(getValue("id == '1'", context));// false
        System.out.println(getValue("id == '1'.toString()", context));// true
        // 单个字符的非数字型字符串
        try {
            System.out.println(getValue("name == 'z'", context));
        } catch (Exception e) {
            // 'z'不能被转成数值型,此处会抛出NumberFormatException
            e.printStackTrace();
        }
        System.out.println(getValue("name == \"z\"", context));// true
        System.out.println(getValue("name == 'z'.toString()", context));// true

        // 不是单个字符的字符串
        System.out.println(getValue("sex == 'man'", context));// true
        System.out.println(getValue("sex == \"man\"", context));// true
        System.out.println(getValue("sex == 'man'.toString()", context));// true
    }
    public static Object getValue(String expression,Object map) throws OgnlException {
        return Ognl.getValue(expression, map);
    }

}

02-29 10:31