MyBatis @Update执行报错,调整WHERE条件后能否解决问题?
解决MyBatis @Update 报错 "Expected one result (or null) to be returned by selectOne(), but found: 2"
问题回顾
你最初使用的MyBatis更新语句如下:
@Update("UPDATE TABLE_ROUTE SET TABLE_CODE =#{tableCode}, ACTIVE =#{active}, ROUTE_ID =#{routeId} WHERE TABLE_CODE=#{tableCode}") int updateTableRoute(TableRoute tableRoute);
执行时触发报错:"Expected one result (or null) to be returned by selectOne(), but found: 2",原因是WHERE TABLE_CODE=#{tableCode}匹配到了数据库中的2条记录,不符合预期的单条更新逻辑。
修改后的语句有效性分析
你修改后的语句:
@Update("UPDATE TABLE_ROUTE SET TABLE_CODE =#{tableCode}, ACTIVE =#{active}, ROUTE_ID =#{routeId} WHERE TABLE_CODE=#{tableCode} and ROUTE_ID =#{routeId}") int updateTableRoute(TableRoute tableRoute);
完全可以解决这个报错问题,原因如下:
- 新增的
ROUTE_ID =#{routeId}让WHERE条件的精准度大幅提升,只要TABLE_CODE和ROUTE_ID的组合是业务上的唯一标识(或者在当前场景下只会匹配到1条记录),这条UPDATE语句就只会命中并更新1条数据。 - 当更新操作仅影响单条记录时,MyBatis的校验逻辑就不会再触发"找到多条结果"的报错。
额外建议
如果TABLE_CODE + ROUTE_ID并非表的唯一约束,建议你进一步确认业务逻辑,补充更精准的过滤条件(比如主键ID),确保每次更新操作都只会作用于预期的单条数据,避免后续出现类似问题。
内容的提问来源于stack exchange,提问作者anirudh reddy
相关产品推荐
相关产品推荐

