前言
持久层:MyBatis
组合查询一组数据,字段有:String Integer 类型。
由于字段都可能为空,所以mapper文件中这样写的:
实践
<select id="selectIndexAvgStore" resultMap="IndexShardNumCheck" useCache="false" flushCache="true">
<include refid="selectShardNumCheck"/>
<where>
<if test="indexPattern != null and indexPattern != ''">
index_pattern like concat('%', #{indexPattern, jdbcType=VARCHAR}, '%')
</if>
<if test="rationality != null and rationality != ''">
AND rationality = #{rationality}
</if>
</where>
</select>
但是此时并不能正确的查询到数据
问题原因:
status=‘’
MyBatis解析if标签时其表达式使用OGNL处理的。
Interpreting Objects as Booleans
Any object can be used where a boolean is required. OGNL interprets objects as booleans like this:
If the object is a Boolean, its value is extracted and returned;
If the object is a Number, its double-precision floating-point value is compared with zero; non-zero is treated as true, zero as false;
If the object is a Character, its boolean value is true if and only if its char value is non-zero;
Otherwise, its boolean value is true if and only if it is non-null.
如果对象是Number类型,当传值为0时会被解析成false,否则为true,浮点型0.00也是如此。所以这里直接解析成false。只有String类型才需要判断是否!=’’,其他类型完全没有这个必要。
解决方案:
<select id="selectIndexAvgStore" resultMap="IndexShardNumCheck" useCache="false" flushCache="true">
<include refid="selectShardNumCheck"/>
<where>
<if test="indexPattern != null and indexPattern != ''">
index_pattern like concat('%', #{indexPattern, jdbcType=VARCHAR}, '%')
</if>
<if test="rationality != null">
AND rationality = #{rationality}
</if>
</where>
</select>