MyBatis Plus对关联查询一对多 分页不准确问题解决

今天在和前端联调的时候,突然被告知接口分页有问题,不准确,随后debug发现的确如此:

在这里插入图片描述

xml代码:
<resultMap id="getRoleInfoMap" type="com.lylb.casecenter.entity.vo.RoleVO">
        <id column="roleId" property="id"/>
        <result column="roleName" property="name"/>
        <collection property="permissionList" ofType="com.lylb.casecenter.entity.vo.PermissionVO">
            <id column="permissionId" property="permissionId"/>
            <result column="name" property="name"/>
        </collection>
    </resultMap>

 <select id="getRoleList" resultMap="getRoleInfoMap">
        SELECT
            r.id roleId,
            r.NAME roleName,
            p.id permissionId,
            p.name
        FROM
            role_permission rp
            LEFT JOIN role r ON rp.role_id = r.id
            LEFT JOIN permission p ON rp.permission_id = p.id
        WHERE
            r.`status` = '0'
            AND r.deleted = '0'
    </select>

随后查看MyBatis Plus 官方文档发现:
在这里插入图片描述
而我这里恰恰如此,left join的表 并没有参与where条件过滤。

解决方案:

将关联查询分开查询,将结果合并展示即可

更改之后代码
    <resultMap id="getRoleInfoMap" type="com.lylb.casecenter.entity.vo.RoleVO">
        <id column="roleId" property="id"/>
        <result column="roleName" property="name"/>
        <collection property="permissionList" ofType="com.lylb.casecenter.entity.vo.PermissionVO"
                    javaType="java.util.List" select="getPermission" column="roleId">

        </collection>
    </resultMap>

    <resultMap id="getPermissionMap" type="com.lylb.casecenter.entity.vo.PermissionVO">
        <id column="permissionId" property="permissionId"/>
        <result column="name" property="name"/>
    </resultMap>

    <select id="getRoleList" resultMap="getRoleInfoMap">
        SELECT
            r.id roleId,
            r.NAME roleName
        FROM role r
        WHERE r.`status` = '0' AND r.deleted = '0'
    </select>

    <select id="getPermission" resultType="com.lylb.casecenter.entity.vo.PermissionVO">
        select
            rp.role_id roleId,
            p.id permissionId,
            p.name
        from role_permission rp
        LEFT JOIN permission p ON rp.permission_id = p.id
        where rp.role_id = #{roleId}
    </select>
结果正确

在这里插入图片描述

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
MyBatis Plus 的 XML 配置文件可以用于实现一对一或多对一关联关系下的分页查询,对于一对多(ManyToOne 或者 OneToMany),你可以通过以下步骤完成: 1. **映射关系**:首先,在实体类(Entity)中,你需要在目标实体类上设置 `@TableId` 和 `@TableField` 注解,而在关联的实体类上,通常会有一个 `@OneToOne` 或 `@OneToMany` 关联字段。 ```java // 主体类(User) @Table(name = "user") public class User { @TableId(value = "id", type = IdType.AUTO) private Long id; // 其他字段... @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "department_id") private Department department; // 这里假设有一个部门关联 } // 关联类(Department) @Table(name = "department") public class Department { @TableId(value = "id", type = IdType.AUTO) private Long id; // 其他字段... } ``` 2. **分页查询**:在 SQL 映射 XML 文件中,你可以编写一个动态 SQL 查询语句,包括 LIMIT 和 OFFSET 用于分页。例如: ```xml <select id="selectDepartmentsByUser" resultType="Department"> SELECT * FROM department WHERE user_id = #{userId} ORDER BY id ASC <if test="offset != null and limit != null"> LIMIT #{offset}, #{limit} </if> </select> ``` 这里,`${offset}` 和 `${limit}` 是 MyBatis 的参数占位符,可以在调用方法时传入当前页数和每页大小。 3. **调用方法**:在 Service 层或 Controller 中,你可以使用 `BaseMapper` 或自定义的 Mapper 接口提供的分页查询方法,并传入用户 ID 和页码信息: ```java List<Department> departments = departmentMapper.selectDepartmentsByUser(userId, page, size); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值