美文网首页
Mybatis where内第一个and不删除

Mybatis where内第一个and不删除

作者: CaesarH000 | 来源:发表于2023-08-27 11:43 被阅读0次

记一个神奇的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%') 报了个语法错误。

只能说,空格拯救世界。

相关文章

网友评论

      本文标题:Mybatis where内第一个and不删除

      本文链接:https://www.haomeiwen.com/subject/rocwmdtx.html