相同SQL在MyBatis与MySQL Workbench返回结果不一致问题求解
问题原因排查方向
1. 首先确认MyBatis的参数是否正确传递
- 检查DAO层对应方法的参数注解是否和SQL里的占位符完全匹配:注意大小写敏感,如果方法里写的是
@Param("myUid")(U大写),但SQL里用的是#{myuId}(u小写),会导致#{myuId}实际拿到null值,左连接条件bu.uid = null永远不成立,所有行的statusCode都会返回0 - 可以开启MyBatis的SQL打印配置,查看实际执行的SQL代入参数是否和预期一致:
打印出的SQL如果显示bu.uid的参数为null或者不是预期的1,就是参数传递错误。<!-- mybatis配置文件中添加 --> <setting name="logImpl" value="STDOUT_LOGGING"/>
2. 检查结果映射配置
- 确认返回的实体类中
statusCode字段的名称、类型和SQL返回的别名完全匹配:- 如果用的是自动映射,实体类字段名必须和SQL里的
statusCode别名完全一致(大小写也要匹配,部分系统区分大小写) - 如果用的是自定义
resultMap,检查statusCode对应的列是否写对,不要误映射到其他字段比如au.uid - 不要把
statusCode定义为布尔类型,避免MyBatis做值转换时把非0值识别成true,再映射成数字时出现异常。
- 如果用的是自动映射,实体类字段名必须和SQL里的
3. 检查是否有SQL拦截器篡改语句
如果项目里配置了分页插件、多租户插件、权限拦截器等MyBatis拦截器,可能会自动修改你的SQL语句:比如给bu表额外添加了全局过滤条件,导致左连接查询bu表的结果全部为空,statusCode自然全为0。可以通过打印实际执行的SQL和原生执行的SQL对比,确认语句是否一致。
优化提示:当前SQL里用
having过滤au.friendId = #{uid}属于不必要的写法,没有聚合函数的情况下直接把条件放到where里即可,执行效率更高,也能避免部分旧版本MySQL的执行计划异常。
内容的提问来源于stack exchange,提问作者Link He
相关产品推荐
相关产品推荐

