此处表明使用的是page对象进行的分页,并没有手动在xml中写入limit,出现的问题,不知道手写limit是否也会出现这个问题.
问题描述
mybatis多表联查时 同时使用了分页插件, 导致数据不正确,A表根B表进行了关联,此时我们使用xml文件进行多表联查, 例如:
查询所有教师,并且查询出每位教师所管理的班级, 我们使用一个DTO类来映射信息,DTO类中包含教师信息, 与班级集合, 我们的需求是, 将老师信息映射到属性中, 这位老师所管理的班级信息映射到集合中.
where : 条件是分页查询某某页的前1位教师的数据!
事故现场
此时出现的问题是, 通过分页page对象查询后, 分页效果是出现了, 分页查询出了10位教师, 但是每位教师下的班级数据出现了问题.
查询出的班级也是一个.....
解决方案
分步查询:
我们需要分页的数据是教师表,那么班级表则不需要,让两个分开查询, 分开赋值
, 通过 resultMap 映射实现分步查询.
<!-- 首先第一步我们先查询teacher表 然后去设置它的映射关系 -->
<select id="getPageTeacherAndClass" resultMap="pageTeachetMap">
SELECT *
FROM teacher
</select>
<!-- 第二步查询班级表 并且设置关联条件 -->
<select id="getCclass" resultType="Cclass">
SELECT *
FROM cclass
WHERE teacher_id = #{teacherId}
</select>
<!-- 第三步编写 resultMap 处理映射关系 -->
<resultMap id="pageTeachetMap" type="TeacherDto">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<result property="phone" column="phone"/>
<!-- 通过分步查询单独查询它的数据 select 是查询语句的id -- column是传入的条件id -->
<collection property="cclassList" ofType="Cclass" select="getCclass" column="id" />
</resultMap>
以上纯属个人遇见此问题解决的方式, 在这里记录, 想了个这样的案例解释, 纯属个人见解,如有更好的办法欢迎讨论.