文章目录

  • 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()方法。但根据你的查询条件,查询到了多条数据。

具体怎么修改,你可以自选产品经理。根据产品经理的需求,来确定最佳的解决方案。

如果我的解决方法,无法解决你的问题,可以在评论区留言,大家共同进步。