记一个神奇的bug
起因
写查询条件,做页面的筛选框,然而怎么查都报错,看了一眼后台输出,发现是sql语句中where 后的第一个and是没有没删除的,部分源码如下:
<select id="list">
select * from table
<where>
<if test="id != null and id != ''">
and id = #{id}
</if>
<if test="status != null">
and status = #{status}
</if>
<if test="keywords != null and keywords != ''">
and( userName like '%${keywords}%'
or userAccount like '%${keywords}%')
</if>
</where>
</select>
排查原因
一开始以为是敲键盘的时候,把参数名敲错了几个字母,导致关系没有映射上,遂使用cv大法,确保整个过程中的参数名都是一致的,测试==》失败。
又以为是将带有括号的条件放在后方,但第一条条件没有触发导致的,遍将该查询语句放在where条件中的第一条,测试==》失败。
后又以为是因为status的类型为int,在判断非空时使用了0,导致了干扰,故将筛选条件中的“!= null”更换为了“!= 0”,测试==》失败。
问题解决
mybatis会将where后的第一个“and”或“or”自动删除, 但在源码中,我使用的是“and(”,导致mybatis识别失败,没有删除第一个“and”,最终呈现出来的sql语句是select * from table where and( userName like '%123%' or userAccount like '%123%')
报了个语法错误。
只能说,空格拯救世界。
网友评论