nested exception is org.apache.ibatis.exceptions.TooManyResultsException:

求帮助,感谢
2023/5/14

问题:nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2

预计返回一个结果(或 null),但发现2个

img

不知道你这个问题是否已经解决, 如果还没有解决的话:


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

这个错误表示在使用MyBatis进行数据库操作时,一个查询返回了多个结果,但MyBatis无法确定要返回哪一个结果,所以抛出了TooManyResultsException异常。
这种情况通常出现在:

  1. 使用了返回多个结果的查询语句,如未带有限制条件的SELECT * FROM TABLE查询
  2. 没有指定返回结果的类型,导致MyBatis无法判断要返回哪种结果
  3. 错误的 SQL 语句返回了多个意外结果
    要解决这个错误,可以尝试以下步骤:
  4. 在 SQL 语句中添加LIMIT 1或其他限制条件,确保每个查询只返回 1 条结果
  5. 为查询结果指定返回类型,如:
xml
<select ... resultType="com.domain.User">
  SELECT * FROM USER 
</select>

  1. 检查 SQL 语句是否正确,没有语法错误导致返回意外结果
  2. 在查询方法上添加 @Results 注解,通过id属性明确指定要返回的结果
java
@Results(id = "user", value = {
    @Result(property = "id", column = "uid"),
    @Result(property = "name", column = "username")
})
@Select("SELECT * FROM USER")
User findUser(); 

  1. 在查询语句中使用别名,并在@Result中指定property与列名的映射关系,避免由于同名列导致的错误结果
xml
<select ...>
  SELECT 
    uid AS "id", 
    username AS "name"
  FROM USER
</select>

<resultMap id="user" type="com.domain.User">
  <id property="id" column="id" />
  <result property="name" column="name" /> 
</resultMap>