解决mybatis plus 一对多分页查询问题

换了很多姿势使用mybatis-plus分页还是有问题

问题

比如: 订单表跟订单信息表是一对多关系,分页每页查询出来的数据是以订单商品表为主的,万一 一个订单有十个商品的话,那就只能查询一条单了,这明显就存在问题,

我需要的是每页的条数是以订单表为主的,如果你遇到跟我同样的问题请往下看......

mapper层

 /**
     * 分页获取订单数据
     *
     * @param orderPara 订单传参数类
     * @return
     */
    public IPage<Orders> selectOrdersList(@Param("page") Page<Orders> page, @Param(Constants.WRAPPER) Wrapper<Orders> wrapper, @Param("orderPara") OrderParaVo orderPara);
 /**
     * 获取订单商品信息数据
     *
     * @param orderNo 订单号
     * @return 订单商品数据
     */
    public List<OrderItem> selectOrderItemList(String orderNo);

xml

使用collection标签的select属性来映射

<resultMap id="BaseResultMap" type="xxx.xxx.xxx.Orders">
...
这里订单表字段忽略
<collection property="orderItemsList" ofType="xxx.xxx.xxx.OrderItem" select="selectOrderItemList" column="order_no"/>
</resultMap>

property:  对应映射的订单商品类(private List<OrderItem> orderItemsList;)

ofType: 订单商品类的包名路径

select: 查询订单商品的名称

column: 两表关联的条件字段(数据库的)

sql

 <!--分页获取订单数据-->
    <select id="selectOrdersList" resultMap="BaseResultMap" parameterType="xxx.xxx.xxx.vo.OrderParaVo">
        select
        <include refid="Orders_Base_Column_List"/>
        from orders
        <where>
            <if test="orderPara.memberId != null">
                 orders.member_id = #{orderPara.memberId}
            </if>
        </where>

        order by orders.create_time desc ${ew.customSqlSegment}
    </select>

注意: orderPara是传值Vo类在mapper层订单的别名,这样使用实体传值的话能传多个参数进来。

<!--获取订单商品信息数据-->
    <select id="selectOrderItemList" resultType="xxx.xxx.xxx.OrderItem">
        select
        <include refid="OrderItem_Base_Column_List"/>
        from order_item
        <where>
            <if test="orderNo != null">
                order_item.order_no = #{orderNo}
            </if>
        </where>
    </select>

controller

这里直接调用mapper层了,需要规范的话,在service层写个接口调用mapper,然后controller再调用业务层,所有的业务层代码写在service实现层就好了......

@GetMapping("listOrdersList")
    public AjaxResult test(@RequestBody OrderParaVo orderParaVo) {
        QueryWrapper<Orders> queryWrapper = new QueryWrapper<>();
        Page<Orders> page = new Page<Orders>(orderParaVo.getPageNum(), orderParaVo.getPageSize());
        IPage<Orders> userPageList = ordersMapper.selectOrdersList( page, queryWrapper,orderParaVo);
        return AjaxResult.success(userPageList);
    }

如有其它办法能解决这个问题的话请下方留言哦,非常感谢!

原文地址:https://www.cnblogs.com/ckfeng/p/15572122.html