前言
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先对一的一方的结果进行分页,在使用多关系一方的数据对其进行填充,这样才不会出现分页失效的问题