解决 mybatis plus 分页使用collection导致返回数据不正确的问题

3,063 阅读1分钟

解决 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条

image-20211214130457548.png

image-20211214130753311.png

image-20211214132528470.png

注意观察 id为93的【产品自测测试计划】这条记录,关联查询数来后是两条记录,但是使用mybatis的resultMap包装后这个就是属于一条记录,而这条记录里面有一个list存储两条关联数据,这样就导致了数据不正确的问题

解决方案如下

  1. 查询的时候先使用 group by 去重,返回分页后的数据,只需要数据的id即可
  2. 拿到步骤一返回的List ids 去做一次 in 查询,就能返回准确的数据了

步骤一 group by f.id 后返回 f.id

image-20211214133413112.png

步骤二 将查询到的id列表通过 in再次查询出来

image-20211214134015795.png