问题
在开发过程中可能会出现这种需求,根据字段sex进行判断,sex的值为0、1,鉴于以上需求,mapper.xml经常有小伙伴这样去书写:
<select id="selectUserList" paramterType="int">
select * from t_user
<where>
<if test="sex != null and sex != ''">
and sex=#{sex}
</if>
</where>
</seclect>
但是发现,就算给sex传递了值,比如sex=0,表达式的结果仍为false,sql语句sex=#{sex}并没有动态拼接到原SQL中,这是为什么呢?原因是因为标签test属性中的表达式的语法结构为OGNL,然而OGNL表达式和JavaScript又很相似,即:false=0,‘’=0,‘’=false,所以也就弄明白了当前案例标签的结果为什么是false了,因为 false != false不成立,可以将当前案例改为以下情况即可解决为题:
思路1、将0和1解析成字符串
<if test="sex != null and sex.toString() != ''">
and sex=#{sex}
</if>
或者
<if test='sex != null and sex != ""'>
and sex=#{sex}
</if>
思路2、将数值0、1对于字符的判断去掉
<if test="sex != null">
and sex=#{sex}
</if>