You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mybatis<if>标签判断异常,传入48不触发条件传入2正常问题排查

问题根因

该问题是MyBatis OGNL表达式的类型隐式转换规则导致的:数字类型和单引号包裹的单个字符比较时,会自动取字符的ASCII码值参与数值运算。

具体逻辑拆解

  1. 你在<if>判断中写的userId != '0'里,'0'是单引号包裹的字符类型,它对应的ASCII码数值为48。
  2. 当传入userId值为48时,userId != '0'的判断逻辑会被解析为48 != 48,判断结果为false,整个<if>条件不生效。
  3. 条件失效后SQL不会拼接where子句,最终执行的是全表count查询,你的测试表共有5条数据,因此返回count=5。
  4. 当传入userId值为2时,2 != 48判断结果为true,<if>条件正常生效,拼接where子句后查询结果符合预期。

其他不合理配置说明

  • 你的Mapper接口参数定义为基本类型int userId,基本类型不可能为null也不可能为空字符串,userId != null和userId != ''两个判断完全多余,反而会增加逻辑隐患。
  • 如果你要判断userId不等于数字0,应该直接写数值比较userId != 0,不要加单引号,单引号在OGNL中会被识别为字符/字符串类型。

修正后的配置示例

<select id="selectCount" resultType="java.lang.Integer">
    select count(*) from cl_class
    <if test="userId != 0">
      where user_id = #{userId,jdbcType=BIGINT}
    </if>
</select>

如果后续将参数调整为包装类型Integer,可以补充非空判断:

<if test="userId != null and userId != 0">

内容的提问来源于stack exchange,提问作者jiangxiaopeng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:45:02