mybatis collection级联查询分页不准确问题

72 阅读1分钟

原来的分页是这么写的:

<resultMap id="packageSystemRoleResult" type="com.test.admin.domain.result.productpackage.GmsPackageSystemRoleResult">
    <id property="systemId" column="system_id" />
    <result property="packageId" column="package_id" />
    <result property="systemId" column="system_id" />
    <result property="systemName" column="system_name" />
    <collection property="roleList" ofType="com.yxt.gmsv2.admin.domain.result.productpackage.GmsPackageRoleResult">
        <result property="roleId" column="role_id" />
        <result property="roleName" column="role_name" />
    </collection>
</resultMap>

<select id="getGmsPackageSystemRoleList" resultMap="packageSystemRoleResult">
    select a.id,a.package_id,a.system_id,a.role_id,b.system_name,c.role_name
    from gms_package_system_role a left join gms_system b on a.system_id = b.id and b.del_flg = 0
            left join gms_role c on a.role_id = c.id and c.del_flg = 0
            where a.del_flg = 0 and a.package_id = #{params.packageId}
            <if test="params.systemName != null and params.systemName != ''">
                and b.system_name like concat('%', #{params.systemName}, '%')
            </if>
    order by a.system_id
</select>

把跟role相关的直接转换成role对象,这样写如果查询所有的数据是没有问题的,但是如果是分页查询的话,总条数就会有问题,这个查询出来的的是包含role的条数,不是单纯system的条数。 修改方案如下:

<resultMap id="packageSystemRoleResult" type="com.test.admin.domain.result.productpackage.GmsPackageSystemRoleResult">
    <id property="systemId" column="system_id" />
    <result property="packageId" column="package_id" />
    <result property="systemId" column="system_id" />
    <result property="systemName" column="system_name" />
    <collection property="roleList" select="getRoleListBySystemId" column="system_id">
        <result property="roleId" column="role_id" />
        <result property="roleName" column="role_name" />
    </collection>
</resultMap>

<select id="getGmsPackageSystemRoleList" resultMap="packageSystemRoleResult">
    select a.id,a.package_id,a.system_id,a.role_id,b.system_name
    from gms_package_system_role a left join gms_system b on a.system_id = b.id and b.del_flg = 0
            where a.del_flg = 0 and a.package_id = #{params.packageId}
            <if test="params.systemName != null and params.systemName != ''">
                and b.system_name like concat('%', #{params.systemName}, '%')
            </if>
    group by a.system_id order by a.system_id
</select>

<select id="getRoleListBySystemId" resultType="com.test.admin.domain.result.productpackage.GmsPackageRoleResult">
    select a.role_id, c.role_name
    from gms_package_system_role a
             left join gms_role c on a.role_id = c.id and c.del_flg = 0
    where a.del_flg = 0 and a.system_id = #{system_id}
</select>

先查system,再级联查询role,这样总条数就是system的条数了,