在 MyBatis 中出现 TooManyResultsException
(”Too many results” 错误)通常是因为:
使用了 selectOne
方法,但实际返回了多条记录。
原因解释:
selectOne()
是 MyBatis 提供的一个查询方法,预期只能返回一条结果。它的底层逻辑是这样的:
if (list.size() == 1) {
return list.get(0);
} else if (list.size() > 1) {
throw new TooManyResultsException(...);
}
所以当数据库中匹配条件的结果有 多于一条记录 时,就会抛出这个异常。
常见导致原因有:
- 数据库中本就存在多条匹配记录(如未加唯一条件)。
- SQL 写错了,少了 WHERE 条件或条件不够具体。
- 字段本应唯一,但数据存在重复记录。
- 使用了关联查询(join),导致返回了多条结果。
解决办法:
- 如果你只想取第一条,可以改用
selectList()
并手动.get(0)
(要注意判空)。 - 如果你确保只应有一条记录,那就检查:
示例:
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()
,打印结果确认返回了哪些记录。