mybatis分页引发的bug小记

1,218 阅读1分钟

这几天做了个关于mybatis一对多的分页,发现了一个bug,在这记录下。

代码分析

一对多包装类如下

@Data
public class AreaStoreEnv {

    private java.lang.String id;

    private java.util.Date createTime;

    private java.util.Date updateTime;

    private java.lang.Integer orders;

    private java.lang.String fullName;

    private java.lang.Integer grade;

    private java.lang.String name;

    private java.lang.String treePath;

    private java.lang.String parentId;

    /**
     * 知识库信息
     */
    private List<StoreEnv> storeEnvList;
}

这时候如果使用正常的一对多写一个resultMap然后通过left join分页查询,然后每页数量为10,他会将嵌套的内容也当做查询结果数量,这样分页查的数量就不足10个。

解决方案

在collection标签里加select属性来单独调用查询多方数据。column属性为传入的参数

    <resultMap id="AreaStoreEnvMap" type="org.scloud.modules.storeEnv.vo.AreaStoreEnv">
        <id column="id" property="id"/>
        <result column="full_name" property="fullName"/>
        <result column="grade" property="grade"/>
        <result column="parent_id" property="parentId"/>
        <result column="name" property="name"/>
        <collection property="storeEnvList"
                    select="getStoreEnv"
                    column="id"
                    ofType="org.scloud.modules.storeEnv.entity.StoreEnv">
            <id column="sid" property="id"/>
            <result column="area_id" property="areaId"/>
            <result column="env_data_type" property="envDataType"/>
            <result column="file_name" property="fileName"/>
            <result column="file_url" property="fileUrl"/>
            <result column="remark" property="remark"/>
        </collection>
    </resultMap>
    ```
    
    查询语句
    
    ```xml
    <select id="searchAreaStoreEnvByAreaIds" resultMap="AreaStoreEnvMap">
        select a.*
        from sc_area a
        <where>
            <foreach collection="areaIds" item="id" open="and a.id in (" close=") " separator=",">
                #{id}
            </foreach>
        </where>
        order by a.grade
    </select>

    <!--    mybatis嵌套查询分页后数量会有bug,解决方案如下-->
    <select id="getStoreEnv" parameterType="String" resultType="org.scloud.modules.storeEnv.entity.StoreEnv">
     select se.id as sid,se.area_id,se.env_data_type,se.file_name,se.file_url,se.remark
     from sc_basic_store_env se
     where se.area_id=#{id}
     order by se.env_data_type,se.create_time desc
    </select>
    ```