首页 > 其他分享 >ruoyi中 mybatis 一对多以及pageHelper分页问题

ruoyi中 mybatis 一对多以及pageHelper分页问题

时间:2024-03-22 17:14:13浏览次数:27  
标签:orderItem 分页 List ruoyi Long pageHelper private mybatis totalNum

问题

  1. mybatis 如何进行一对多映射
  2. mybatis 分页时无法获取的totalCount数据不对,总等于pageSize

需要返回的结果

public class OrderOutput {
    private Long totalNum;// 当前订单所有总数
    private Long orderTotalPrice;// 当前订单所有产品总价
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    @JSONField(serializeUsing = ToStringSerializer.class)
    private Long orderId; // 当前订单编号
    private Date createTime;// 订单时间
    private Integer orderStatus;
    private List<OrderDto> orderItems; // 订单详单
}


public class OrderDto {
    private Long id;
    private Long uid;
    private Long pnum;
    private Long totalPrice;
    private String uname;
    private String pname;
    private Long price;
}

当前接口的需求是,返回订单list,并且每个item中的有订单详单,并且需要实现分页查询。
当前订单需要统计所有详单中的订单产品总数,以及每一个所有产品的累计金额。

实现

Service

在Service中,调用mapper方法,并统计订单总金额以及总数量

List<OrderOutput> orderOutputs = orderIdsMapper.selectOrderIds(new OrderIds());

orderOutputs.forEach(x -> {
            List<OrderDto> orderItems = x.getOrderItems();
            long totalPrice = 0L;
            Long totalNum = 0L;

            for (OrderDto orderItem : orderItems) {
                totalPrice += orderItem.getPnum() *orderItem.getPrice();
                totalNum += orderItem.getPnum();
            }

            x.setTotalNum(totalNum);
            x.setOrderTotalPrice(totalPrice);
            result.add(x);
        });

Mapper xml

在mapper中分别定义OrderOutput的resultMap以及List中的OrderDto的resultMap,并把orderDto的resultMap作为orderREsultMap的子查询结果。
同时,分别写两个select查询,传参可以参考下面xml,多个传参在column中param1=a,param2=b

<resultMap id="orderREsultMap" type="OrderOutput">
        <id property="orderId" column="orderId" />
        <result property="createTime" column="createTime" />
        <result property="orderStatus" column="orderStatus" />
        <collection property="orderItems"
                    ofType="OrderDto"
                    select="getOrderDtoById"
                    column="{id=orderId}"
                    javaType="java.util.List"
        >

        </collection>
    </resultMap>

    <resultMap id="OrderDtoMap" type="OrderDto">
        <id property="id" column="id"/>
        <result property="uid" column="uid"/>
        <result property="uname" column="uname"/>
        <result property="pnum" column="pnum"/>
        <result property="totalPrice" column="totalPrice"/>
    </resultMap>

<!--    子查询-->
    <select id="getOrderDtoById" resultMap="OrderDtoMap">
        select o.uid,o.uname,o.pnum,o.total_price
        from orders o
        where o.order_id = #{id}<!-- id对应上面collection中的column -->
    </select>

<!--    主查询-->
    <select id="selectOrderIds" resultMap="orderREsultMap">
        select
            oi.id as orderId,
            oi.create_time as createTime,
            oi.order_status as orderStatus
        from
            order_ids oi
    </select>

Controller

    @PreAuthorize("@ss.hasPermi('danchen_system:orders:list')")
    @GetMapping("/list")
    public TableDataInfo list() {
        startPage();
        List<OrderOutput> orderList = ordersService.GetOrdersList();
        return getDataTable(orderList);
    }

ruoyi-vue使用startPage对数据进行分页,使用的是PageHelper,但是通过返回数据发现,获取到的total为list的数量,例如原本不分页之前数据量为13,分页之后返回的数据量为10,也就是前端请求数据是的pagesize大小。

参考文档说是破坏了PageInfo的完整性,将service中的循环处理逻辑删除之后进行验证,发现返回total数已经正确了,说明确实是这部分出错了。

解决

要继续使用ruoyi的startPage进行分页,并且不破坏原来的数据完整性,根据若依官网后台分页逻辑的介绍只对该语句以后的第一个查询(Select)语句得到的数据进行分页。,因此等数据分页完整之后,再对数据进行处理即可,接口修改如下

Controller

public TableDataInfo list() {
        startPage();
        List<OrderOutput> orderList = ordersService.GetOrdersList();
        orderList.forEach(x -> {
            List<OrderDto> orderItems = x.getOrderItems();
            long totalPrice = 0L;
            Long totalNum = 0L;

            for (OrderDto orderItem : orderItems) {
//                totalPrice += orderItem.getPnum() *orderItem.getPrice();
                totalNum += orderItem.getPnum();
            }

            x.setTotalNum(totalNum);
            x.setOrderTotalPrice(totalPrice);
        });
        return getDataTable(orderList);
    }

Service

public List<OrderOutput> GetOrdersList() {
        return orderIdsMapper.selectOrderIds(new OrderIds());
    }

将原来在Service的处理逻辑,在Controller中实现

标签:orderItem,分页,List,ruoyi,Long,pageHelper,private,mybatis,totalNum
From: https://www.cnblogs.com/kelvinxiong/p/18089950

相关文章

  • 2020-5-11-Mybatis
    框架和架构、MyBatis概述、入门、增删改查操作、dao实现类增删改查、引用外部配置文件、配置实体类别名、注册指定包内的dao接口、动态sql、一对多查询、多对多查询、延迟加载、mybatis缓存、注解开发框架和架构1框架软件开发的一套解决方案,不同框架解决不同问题。框架中封装很......
  • ruoyi-nbcio-plus基于vue3的flowable增加开始节点的表单绑定修改
    更多ruoyi-nbcio功能请看演示系统gitee源代码地址前后端代码:https://gitee.com/nbacheng/ruoyi-nbcio演示地址:RuoYi-Nbcio后台管理系统http://122.227.135.243:9666/更多nbcio-boot功能请看演示系统 gitee源代码地址后端代码:https://gitee.com/nbacheng/nbcio-boot......
  • 宠物医院管理系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图项目介绍随着宠物行业的快速发展和宠物数量的不断增加,宠物医疗服务的需求日益旺盛。宠物医院管理系统作为一种专业的信息化工具,对于提升宠物医院的工作效率、优化顾客服......
  • 房屋中介房源管理系统的设计与实现(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图项目介绍随着房地产市场的蓬勃发展,房屋中介机构在房源管理和客户服务方面面临着日益增长的挑战。一个高效、可靠的房屋中介房源管理系统对于提升中介机构的工作效率、优......
  • SpringBoot - [03] SpringBoot整合Mybatis Plus连接数据库
    原文链接:https://mp.weixin.qq.com/s/ZJTKX_gmn6ffsY7hNrspHQ 一、开发环境JDK:1.8SpringBoot:2.1.1.RELEASEMySQL:8.0.28 二、引入依赖<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId&g......
  • 深入解析Mybatis-Plus框架:简化Java持久层开发(十二)
    ......
  • MyBatis plus之foreach、like、likeRigth、likeLeft
    文章目录1.foreach2.like3.likeLeft4.likeRight1.foreachMybatisPlus提供了foreach标签来简化在查询语句中使用in语句的操作。通过foreach可以将一个集合中的元素拼接成一个逗号分隔的字符串,并将其作为in语句的参数。例如,我们可以使用foreach来生成一个动态的......
  • MyBatis generator配置
    MyBatisgenerator1.在mavenpom.xml中添加插件配置<plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.7</version></plugin>2.在控制台运行指......
  • Mybatis缓存相关
    Mybatis半ORM框架一级缓存二级缓存一级缓存Mybatis一级缓存是作用在SqlSession级别的缓存,用于保存相同查询的结果集,从而提高查询速度。在同一个SqlSession中执行相同查询Sql并且参数一致的情况下,第一次查询出的结果会被缓存在一级缓存中(Hashmap实现),在第二次查询时直接从......
  • Mybatis配置-缓存策略
    MyBatis缓存全面详解一、缓存概述1.定义缓存是一种存储技术,用于临时存储最近访问的数据,以便在需要时可以快速访问。通过减少对持久层的访问次数,缓存可以显著提高应用程序的性能和响应速度。2.特点高速访问:缓存的存在减少了对数据库的访问,从而加快了数据的读取速度......