Mybatis使用collection映射一对多关系查询导致的分页问题

问题描述:
实体类有文章,标签。一篇文章有多个标签
对应的数据库表有m_blog,m_tag和m_blog_tag
Mybatis使用collection映射一对多关系查询导致的分页问题_第1张图片
m_tag表
Mybatis使用collection映射一对多关系查询导致的分页问题_第2张图片

BlogMapper如下:

<resultMap id="blog_tag" type="com.fanta.entity.Blog">
        <result property="bid" column="bid"/>
        <result property="user_id" column="user_id"/>
        <result property="title" column="title"/>
        <result property="description" column="description"/>
        <result property="content" column="content"/>
        <result property="created" column="created"/>
        <result property="status" column="status"/>

        <collection property="tags" javaType="List" ofType="com.fanta.entity.Tag" >
            <result column="tid" property="tid"/>
            <result column="tag_name" property="tag_name"/>
            <result column="created" property="created"/>
        collection>
    resultMap>
    
    <select id="getAllBlogs" resultMap="blog_tag">
        select b.* ,t.* from m_blog b
        left join m_blog_tag bt on bt.bid = b.bid
        left join m_tag t on bt.tid = t.tid 
    select>

这样查询的结果会有11条记录,其中红框中的是一篇文章多个标签的情况:
Mybatis使用collection映射一对多关系查询导致的分页问题_第3张图片

如果使用PageHelper或者MybatisPlus等分页工具,设置每页的大小为5,经过collection映射之后,只会显示bid为1,2,3的文章,而我们想要达到的效果是显示bid为1,2,3,4,5的文章




解决办法:

1.将select语句拆分成两个查询

<resultMap id="blog_tag" type="com.fanta.entity.Blog">
        <result property="bid" column="bid"/>
        <result property="user_id" column="user_id"/>
        <result property="title" column="title"/>
        <result property="description" column="description"/>
        <result property="content" column="content"/>
        <result property="created" column="created"/>
        <result property="status" column="status"/>

    
        <collection property="tags" javaType="List" ofType="com.fanta.entity.Tag" column="bid" select="selectTagById">
            <result column="tid" property="tid"/>
            <result column="tag_name" property="tag_name"/>
            <result column="created" property="created"/>
        collection>
    resultMap>


    <select id="getAllBlogs" resultMap="blog_tag">
        select b.* from m_blog b
    select>


    <select id="selectTagById" resultType="com.fanta.entity.Tag">
        select t.* from m_tag t
        left join m_blog_tag bt on t.tid = bt.tid
        where bt.bid = #{bid}
    select>

2.BlogController为

@GetMapping("blogs")
    public Result blogs(Integer currentPage){
        PageHelper.startPage(currentPage,5);
        List blogs = blogService.getAllBlogs();
        PageInfo<Blog> pageInfo = new PageInfo<Blog>(blogs);
        return Result.succ(pageInfo);
    }

访问接口,可以得到我们想要的效果: 8条记录,每页5条记录,分为2页

Mybatis使用collection映射一对多关系查询导致的分页问题_第4张图片

你可能感兴趣的:(SpringBoot,Mybatis,SpringBoot,Mybatis)