mybatis一对多查询Pagehelper分页条数不对

使用mybatis一对多查询时,通过Pagehelper分页出现条数错误,原因是Pagehelper默认对多的一方进行分页。解决办法是采用子查询,虽然可能导致N+1次查询,但确保了一方的分页正确。关键在于查询方法名匹配及关联条件设置,通过order_main.id与order_main_order.orderMainId关联,实现正确分页。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:在写mybatis一对多的时候用到了Pagehelper进行分页,然后发现确实能分页,但是展示的条数不对,后来研究了发现原来Pagehelper插件在一对多查询的时候默认的是对多的一方进行的分页,不是一的一方。

解决:目前我的解决方式是用子查询,这样能够达到我想要的效果,不过会出现N+1次查询,但是我目前没有找到更好的解决方法,有的朋友可以评论分享一下。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.lmj.order.mapper.OrderMainMapper">
    <resultMap id="BaseResultMap" type="com.lmj.order.pojo.OrderMain">
        <id column="id" property="id" jdbcType="BIGINT"/>
        <result column="uid" property="uid" jdbcType="BIGINT"/>
        <result column="del_flag" property="delFlag" jdbcType="TINYINT"/>
        <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
        <result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/>

        <collection property="orderMainOrders" javaType="list"
                    ofType="com.lmj.order.pojo.OrderMainOrder" select="getOrderMainOrder"
                    column="{orderMainId=id}"> 
            <result property="id" column="oId" jdbcType="BIGINT"/>
            <result property="orderMainId" column="order_main_id" jdbcType="BIGINT"/>
            <result property="orderId" column="order_id" jdbcType="BIGINT"/>
        </collection>
    </resultMap>

    <select id="getOrderMain" resultMap="BaseResultMap">
        SELECT * from order_main a  WHERE a.del_flag = 0 and a.uid = #{uid}
    </select>

    <select id="getOrderMainOrder" parameterType="map"
            resultType="map">
        select b.id as oId,b.order_main_id,b.order_id
        from order_main_order b
        where b.order_main_id = #{orderMainId}
    </select>
</mapper>

order_main表是一的一方,order_main_order是多的一方,然后我把多的一方作为子查询,对一的一方进行分页,就发现分页条数正确了。

这里要注意的就是几个点是否对应:
在这里插入图片描述
首先是查询方法名称一致。

在这里插入图片描述
然后就是使他们相关联的条件,order_main_order表中的orderMainId是order_main表中的id。这个样子就是使他们关联起来了。其实就是一个子查询。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值