标题: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

报错原因:mapper层本该接收一个对象,但是执行该方法的sql后,查询出多个符合条件的对象,导致mybatis框架报错,无法知道注入接收哪个对象。
解决方法:

1.mapper层接收对象时使用List集合接收,例如:
DialoguePO getDialogue(String sid); 改成 List<DialoguePO> getDialogue(String sid);

2.在sql语句结尾加上:limit 1,例如:
将 :
select t.doctor_id, d.doctor_name, t.member_id, m.name, m.study_number, t.insert_dt from t_dialogue t
LEFT JOIN t_doctor d ON t.doctor_id=d.doctor_id
LEFT JOIN t_member m ON t.member_id=m.member_id
where t.member_id = #{memberId} AND t.sender_id = #{memberId} order by t.insert_dt desc

改成:
select t.doctor_id, d.doctor_name, t.member_id, m.name, m.study_number, t.insert_dt from t_dialogue t
LEFT JOIN t_doctor d ON t.doctor_id=d.doctor_id
LEFT JOIN t_member m ON t.member_id=m.member_id
where t.member_id = #{memberId} AND t.sender_id = #{memberId} order by t.insert_dt desc limit 1

这样,当sql执行,只要能获取到一个对象,则即使还有更多符合条件的对象也不查询出来。

3.当你的mapper方法就是需要查询一个对象,且给查询字段加了索引,不想写limit 1。即:你设计数据库的时候认为,每个人对应一个身份证号。但是有一天,数据库里出现了两条相同的数据,两条数据拥有相同的身份证号,继而引发的标题这个报错。那么简单处理就去数据库里给身份证号这个字段加上唯一索引。

注:网络问题等会导致插入两条相同数据的,即两条相同身份证号码(具体为什么下回解释)。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐