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

相同SQL在MyBatis与MySQL Workbench返回结果不一致问题求解

问题原因排查方向

1. 首先确认MyBatis的参数是否正确传递

  • 检查DAO层对应方法的参数注解是否和SQL里的占位符完全匹配:注意大小写敏感,如果方法里写的是@Param("myUid")(U大写),但SQL里用的是#{myuId}(u小写),会导致#{myuId}实际拿到null值,左连接条件bu.uid = null永远不成立,所有行的statusCode都会返回0
  • 可以开启MyBatis的SQL打印配置,查看实际执行的SQL代入参数是否和预期一致:
    <!-- mybatis配置文件中添加 -->
    <setting name="logImpl" value="STDOUT_LOGGING"/>
    
    打印出的SQL如果显示bu.uid的参数为null或者不是预期的1,就是参数传递错误。

2. 检查结果映射配置

  • 确认返回的实体类中statusCode字段的名称、类型和SQL返回的别名完全匹配:
    • 如果用的是自动映射,实体类字段名必须和SQL里的statusCode别名完全一致(大小写也要匹配,部分系统区分大小写)
    • 如果用的是自定义resultMap,检查statusCode对应的列是否写对,不要误映射到其他字段比如au.uid
    • 不要把statusCode定义为布尔类型,避免MyBatis做值转换时把非0值识别成true,再映射成数字时出现异常。

3. 检查是否有SQL拦截器篡改语句

如果项目里配置了分页插件、多租户插件、权限拦截器等MyBatis拦截器,可能会自动修改你的SQL语句:比如给bu表额外添加了全局过滤条件,导致左连接查询bu表的结果全部为空,statusCode自然全为0。可以通过打印实际执行的SQL和原生执行的SQL对比,确认语句是否一致。

优化提示:当前SQL里用having过滤au.friendId = #{uid}属于不必要的写法,没有聚合函数的情况下直接把条件放到where里即可,执行效率更高,也能避免部分旧版本MySQL的执行计划异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 16:06:03