在 MyBatis 中出现 TooManyResultsException(”Too many results” 错误)通常是因为:

使用了 selectOne 方法,但实际返回了多条记录。

原因解释:

selectOne() 是 MyBatis 提供的一个查询方法,预期只能返回一条结果。它的底层逻辑是这样的:

if (list.size() == 1) {
    return list.get(0);
} else if (list.size() > 1) {
    throw new TooManyResultsException(...);
}

所以当数据库中匹配条件的结果有 多于一条记录 时,就会抛出这个异常。

常见导致原因有:

  1. 数据库中本就存在多条匹配记录(如未加唯一条件)。
  2. SQL 写错了,少了 WHERE 条件或条件不够具体。
  3. 字段本应唯一,但数据存在重复记录。
  4. 使用了关联查询(join),导致返回了多条结果。

解决办法:

  • 如果你只想取第一条,可以改用 selectList() 并手动 .get(0)(要注意判空)。
  • 如果你确保只应有一条记录,那就检查:
    • 数据库中是否存在重复数据;
    • SQL 语句是否正确;
    • 是否应当使用唯一索引字段(如主键、唯一约束等)。

示例:

User user = sqlSession.selectOne("selectUserByName", "Tom");

selectUserByName 实际返回了 3 条名字为 “Tom” 的用户记录,就会报:

org.apache.ibatis.exceptions.TooManyResultsException: 
Expected one result (or null) to be returned by selectOne(), but found: 3

需要进一步调试时,可把该 SQL 改为 selectList(),打印结果确认返回了哪些记录。