MyBatis一对多映射失败问题原因与解决方法(一对多查询返回结果只有一条)
文章目录
1、问题描述
-
前言:mybatis高级映射一对多失败原因有多种。
-
问题描述:我这里出现的问题是:在数据库中进行多表联查查询到多条记录结果是正常的一对多情况,但是mybatis映射时装载失败只保留了一条数据。
1) 数据库查询语句与结果如下:
- mysql查询语句如下(一个用户(u.* )对应多条借阅记录(b.* )):
select u.*,b.* from `users` as u left join `borrow` as b on b.`user_id` = u.`id` where !isNull(b.book_id)
-
mysql查询结果如下:
2)mybatis映射文件如下
<resultMap id="BaseResultMap2" type="com.wz.util.vo.BorrowListOut" > <id column="id" property="id" jdbcType="INTEGER" /> <result column="username" property="username" jdbcType="VARCHAR" /> <collection property="borrows" ofType="com.wz.entity.Borrow"> <id column="id" property="id" jdbcType="INTEGER" /> <result column="create_time" property="createTime" jdbcType="TIMESTAMP" /> <result column="end_time" property="endTime" jdbcType="TIMESTAMP" /> <result column="update_time" property="updateTime" jdbcType="TIMESTAMP" /> <result column="ret" property="ret" jdbcType="INTEGER" /> collection> resultMap> <select id="findBorrows" resultMap="BaseResultMap2"> select u.*,b.* from `users` as u left join `borrow` as b on b.`user_id` = u.`id` where !isNull(b.book_id) select>
3)代码展示
//vo包下结果映射实体类: BorrowListOut.java======================================================================================@Datapublic class BorrowListOut extends Users { @ApiModelProperty("借阅记录") private List<Borrow> borrows;}//test包下:测试代码======================================================================================@SpringBootTest(classes = ManagerApplication.class)public class BorrowTest { @Autowired private BorrowService borrowService; @Test void testFandBorrows() { List<BorrowListOut> borrows = borrowService.findBorrows(); for (BorrowListOut borrowListOut : borrows) { System.out.println("用户:"+borrowListOut.getUsername()); System.out.println("借阅条数:" + borrowListOut.getBorrows().size()); for (Borrow borrow: borrowListOut.getBorrows()) { System.out.println(borrow); } System.out.println("-------------------------"); } }}======================================================================================
4)在mybatis实际运行日志中确实查到mysql中的三条数据:
但是最后的测试数据却只有一条(即borrowListOut.getBorrows().size()==1):
2、问题原因与解决
-
问题原因:两张表中的id字段是一样的,这样会导致sql结果集的覆盖:即user表下的id与borrow表下的id
-
解决办法:1、更改数据库中字段名 2、删去其中一个id标签
3、可能其他原因补充
- 参考博文:(1条消息) Mybatis 一对多查询返回结果只有一条:解决思路_mybatis 返回一条_星海一粟的博客-CSDN博客
- 问题原因:可能是column 和 property 不匹配(不一致)的问题了。
- 解决办法:修改column 和 property对应正确即可
来源地址:https://blog.csdn.net/qq_45507768/article/details/130057186