解决 mybatis plus 分页使用collection导致返回数据不正确的问题
在使用mybatis plus 的分页时使用了mybatis 的 collection标签,会导致展示的数据数量不正确
原mapper.xml文件如下
<resultMap id="DocFileServiceVo" type="com.sanyi.data.standard.entity.vo.DocFileServiceVo">
<id property="id" column="id"/>
<collection columnPrefix="ds_"
property="docFileStandardListVos"
ofType="com.sanyi.data.standard.entity.vo.DocFileServiceVo$DocFileStandardListVo">
<id column="id" property="id"/>
<result column="standard_cn_name" property="cnName"/>
<result column="standard_en_name" property="enName"/>
</collection>
</resultMap>
<select id="pageDocFile" resultType="int">
select *
from file_service f
left join standard_list_category_file sf on sf.file_id = f.id
left join standard s on sf.standard_list_id = s.id
order by f.id desc
<where>
<if test="fileServicePageParam.keyWord != null and fileServicePageParam.keyWord != ''">
s.standard_cn_name = #{fileServicePageParam.keyWord}
</if>
</where>
</select>
复制代码
从mapper.xml中可以看出每个DocFileServiceVo对象里面都有一个List
调用分页查询后sql语句如下
select *
from file_service f
left join standard_list_category_file sf on sf.file_id = f.id
left join standard s on sf.standard_list_id = s.id
order by f.id desc
limit 20
复制代码
在数据库中返回的结果确实是有20条
注意观察 id为93的【产品自测测试计划】这条记录,关联查询数来后是两条记录,但是使用mybatis的resultMap包装后这个就是属于一条记录,而这条记录里面有一个list存储两条关联数据,这样就导致了数据不正确的问题
解决方案如下
- 查询的时候先使用 group by 去重,返回分页后的数据,只需要数据的id即可
- 拿到步骤一返回的List ids 去做一次 in 查询,就能返回准确的数据了
步骤一 group by f.id 后返回 f.id
步骤二 将查询到的id列表通过 in再次查询出来