Mybatis中PageHelper分页查询一对多分页失效问题解决

当使用Mybatis的PageHelper进行一对多关系的分页查询时,可能会遇到分页结果不正确的问题。原因是PageHelper只会对主要查询结果进行分页,而不会对一对多中的子数据分页。解决办法是在resultMap中使用select标签,先查询主表并分页,然后根据主表ID再单独查询子表数据。这样确保了PageHelper对主表的分页正确性,避免了一对多分页失效的情况。
摘要由CSDN通过智能技术生成

前言

Mybatis在使用过程中,难免会碰见一对多的关系查询,这时写一个sql语句和resultMap对应的话,可以取到相应的结果,但是如果这时要使用PageHelper对其进行分页的话,会出现分页结果不对的情况。这是因为PageHelper只会对查询结果进行分页,并不会对一对多中一的一方分页。

一、使用场景

此时有订单表、订单状态表、订单商品关联表,此时订单表与订单商品关联表就是一对多的场景

二、代码

1、resultMap代码

	<resultMap id="myOrdersVO" type="com.guolei.pojo.vo.MyOrdersVO">
        <id column="orderId" property="orderId"/>
        <result column="createdTime" property="createdTime"/>
        <result column="payMethod" property="payMethod"/>
        <result column="realPayAmount" property="realPayAmount"/>
        <result column="postAmount" property="postAmount"/>
        <result column="orderStatus" property="orderStatus"/>
        <result column="isComment" property="isComment"/>

        <collection property="subOrderItemList"
                    select="getSubItems"
                    column="orderId"
                    ofType="com.guolei.pojo.vo.MySubOrderItemVO">
            <result column="itemId" property="itemId"/>
            <result column="itemName" property="itemName"/>
            <result column="itemImg" property="itemImg"/>
            <result column="itemSpecName" property="itemSpecName"/>
            <result column="buyCounts" property="buyCounts"/>
            <result column="price" property="price"/>
        </collection>
    </resultMap>

这个写法和一个整个sql的写法有明显的差别,我们在多关系查询时,也用了一个select为其单独写一个sql语句进行查询,这样的效果就达到了先查询订单表,再通过订单表id查询旗下订单商品,这样PageHelper就会先对其订单表进行分页,从而解决一对多分页失效的情况

其中,多关系的一方是命名为 subOrderItemList 的一个订单商品关联的List

getSubItems 为该多关系一方的查询语句

orderId 为当前一对多查询的主键id, 会传递给getSubItems这个sql语句

2、sql代码

	<select id="queryMyOrders" resultMap="myOrdersVO" parameterType="Map">
        SELECT
        od.id as orderId,
        od.created_time as createdTime,
        od.pay_method as payMethod,
        od.real_pay_amount as realPayAmount,
        od.post_amount as postAmount,
        os.order_status as orderStatus,
        od.is_comment as isComment
        FROM
        orders od
        LEFT JOIN
        order_status os
        on od.id = os.order_id
        WHERE
        od.user_id = #{paramsMap.userId}
        AND
        od.is_delete = 0
        <if test="paramsMap.orderStatus != null">
            and os.order_status = #{paramsMap.orderStatus}
        </if>
        ORDER BY
        od.updated_time DESC
    </select>

主订单数据查询

	<select id="getSubItems" parameterType="String" resultType="com.guolei.pojo.vo.MySubOrderItemVO">

        select
            oi.item_id as itemId,
            oi.item_name as itemName,
            oi.item_img as itemImg,
            oi.item_spec_name as itemSpecName,
            oi.buy_counts as buyCounts,
            oi.price as price
        from
            order_items oi
        where
            oi.order_id = #{orderId}

    </select>

多关系一方的数据查询
此处的 orderId 就是 collection 中 column 属性所传递过来的

三、总结

此时我们就解决了PageHelper一对多分页失效的问题,总的来说就是要让PageHelper先对一的一方的结果进行分页,在使用多关系一方的数据对其进行填充,这样才不会出现分页失效的问题

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值