• 解决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);
        }

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

  • 相关阅读:
    [华为]计算字符串的相似度
    Java继承和组合
    Java多态(注意事项)
    Eclipse快捷键
    求二叉树中节点的最大距离
    设计模式-工厂模式
    设计模式-单例模式
    滴滴校招0910
    八大排序算法之七-归并排序
    单链表的实现(创建+排序(选择))
  • 原文地址:https://www.cnblogs.com/ckfeng/p/15572122.html
Copyright © 2020-2023  润新知