文章目录
- 1. 复现错误
- 2. 分析错误
- 3. 解决问题
- 4. 文章备注
1. 复现错误
今天,测试小姐姐告诉我,测试环境的后台管理系统的首页报错了,并发过来如下的一张图:
由于,不能修改测试环境的数据库,只能备份测试环境的数据库,然后复制到我本地。
鼠标置于备份上,右键选择还原备份,点击开始即可,如下图所示:
【注意事项】,还原备份会替换掉当前数据库已有的数据,这个要谨慎执行。
备份到我本地后,使用本地的Knife4j
,来测有问题的接口,如下图所示:
果然出现了异常,即 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2
。
2. 分析错误
正赶上ChatGPT
比较火,可借助它来回到我的问题,如下图所示:
但ChatGP
无法回答我的问题,我只能自己分析此异常了.
我们重点分析Expected one result (or null) to be returned by selectOne(), but found: 2
这句话,将它翻译成中文是希望返回1个结果(或者null),但返回了2个结果。
为什么会返回两个结果呢?我们继续往下分析。
定位到调用selectOne()
方法的地方,如下代码所示:
...... // 获取企业用户 idWrapper<EnterpriseUser> queryWrapper =new LambdaQueryWrapper<EnterpriseUser>() .eq(EnterpriseUser::getUserId, tokenProperties.getUserId());EnterpriseUser enterpriseUser = enterpriseUserService.selectOne(queryWrapper);......
同时,找出mybatis
打印出的SQL
语句,如代码所示:
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2165c177] was not registered for synchronization because synchronization is not activeJDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6c5e6da] will not be managed by Spring==> Preparing: select * from enterprise_user_role r where r.enterprise_user_id = " /> + "FROM " + " enterprise_user_role r " + "WHERE " + " r.enterprise_user_id = #{userId} " + " AND r.role_id IN ( SELECT id FROM role WHERE deleted = 0 ) " + "ORDER BY create_time DESC " + "LIMIT 1")EnterpriseUser selectOneByLimit(@Param("userId") Long userId);
EnterpriseUserService
类新增selectOneByLimit
的方法
/** * 通过用户查询企业用户 * * @author super先生 * @datetime 2023/3/2:13:38 * @param userId 用户id * @return 返回企业用户信息 */public EnterpriseUser selectOneByLimit(Long userId) { return enterpriseUserMapper.selectOneByLimit(userId);}
- 其他服务类调用
EnterpriseUserService#selectOneByLimit
方法
......EnterpriseUser enterpriseUser = enterpriseUserService.selectOneByLimit(tokenProperties.getUserId());......
4. 文章备注
报出如上的错误信息:Expected one result (or null) to be returned by selectOne(), but found: 2
。
一般是你本想查询一条数据,故你使用selectOne()
或者getOne()
方法。但根据你的查询条件,查询到了多条数据。
具体怎么修改,你可以自选产品经理。根据产品经理的需求,来确定最佳的解决方案。
如果我的解决方法,无法解决你的问题,可以在评论区留言,大家共同进步。