错误的分页写法及修改

2023-11-20

一.错误的写法

api:

@GetMapping("/groupList")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "current", value = "页码", required = true, dataType = "Long", dataTypeClass = Long.class),
            @ApiImplicitParam(name = "pageSize", value = "每页大小", required = true, dataType = "Long", dataTypeClass = Long.class),
            @ApiImplicitParam(name = "id", value = "店铺ID", required = true, dataType = "Long", dataTypeClass = Long.class)
    })
    @ApiOperation(value = "小组列表", tags = "9.11.27")
    public BaseResult<PageList<ResLineGroupDTO>> groupList (
            @RequestParam("current") Long current, @RequestParam("pageSize") Long pageSize,
            @RequestParam("id")Long shopId){

        return BaseResult.success(businessShopService.groupList(current,pageSize,shopId));
    }

service:

    /**
     * 根据店铺ID获取对应的小组列表
     *
     * @param shopId 店铺ID
     */
    PageList<ResLineGroupDTO> groupList (Long current,Long pageSize,Long shopId);

实现的方法:

@Override
    public PageList<ResLineGroupDTO> groupList(Long current,Long pageSize,Long shopId) {

        PageList<ResLineGroupDTO> page = new PageList<>();
        page.setPage(current);
        page.setPageSize(pageSize);

        Integer pageStart = (current.intValue() - 1) * pageSize.intValue();

        List<ResLineGroupDTO> resultList = new ArrayList<ResLineGroupDTO>();

        //查询店铺的信息
        BusinessLineShopRelevance shop = this.getBaseMapper().selectById(shopId);

        if(Objects.isNull(shop)){
            throw new BizException("该店铺不存在");
        }
        if(shop.getPrivateSphereFlag()==1 || shop.getType()==2){
            //私域 拿的是 clickhouse private_sphere_group表中的数据
            resultList = biGuiderBoardMapper.getPrivateSphereGuiderGroupList(pageStart,pageSize,shop.getBusinessUnitId());
            //查询私域小组组长
            List<ResShoppingGuideDTO> leaderList = biGuiderBoardMapper.getPrivateSphereGuiderLeaderList();
            if(!leaderList.isEmpty()&&leaderList.size()>0){
                Map<Long, ResShoppingGuideDTO> leaderMap = leaderList.stream().collect(Collectors.toMap(ResShoppingGuideDTO::getGroupId, ResShoppingGuideDTO -> ResShoppingGuideDTO, (k1, k2) -> k2));
                //装配负责人信息
                if(!leaderMap.isEmpty()){
                    for(ResLineGroupDTO dto:resultList){
                        if(leaderMap.containsKey(dto.getId())){
                            ResShoppingGuideDTO dto2 = leaderMap.get(dto.getId());
                            ResPrincipalDTO dto1 = new ResPrincipalDTO(dto2.getId(),dto2.getGuiderEmployeeName());
                            List<ResPrincipalDTO> dtos = new ArrayList<>();
                            dtos.add(dto1);
                            dto.setPrincipalList(dtos);
                        }
                    }
                }
            }

        }else {
            //非私域
            resultList= businessLineGroupMapper.getGroupDetail(pageStart,pageSize,shopId);
            //查询负责人
            List<BusinessPrincipalList> principallist =businessPrincipalListMapper.getGroupPricipalListByShopId(shopId);

            if(!principallist.isEmpty()&&principallist.size()>0){
                Map<Long, List<BusinessPrincipalList>> principalmap = principallist.stream().collect(Collectors.groupingBy(BusinessPrincipalList::getBusinessId));
                if(!principalmap.isEmpty()){
                    for(ResLineGroupDTO dto:resultList){

                        if(principalmap.containsKey(dto.getId())){
                            List<ResPrincipalDTO> dtos = new ArrayList<>();
                            List<BusinessPrincipalList> principalLists = principalmap.get(dto.getId());

                            principalLists.forEach(it->{
                                ResPrincipalDTO dto1 = new ResPrincipalDTO();

                                dto1.setId(it.getEmployeeId());
                                dto1.setName(it.getName());

                                dtos.add(dto1);

                            });


                            dto.setPrincipalList(dtos);
                        }



                    }
                }
            }

        }
        for(ResLineGroupDTO dto:resultList){
            dto.setShopName(shop.getName());
        }

        page.setData(resultList);
        page.setTotal((long)resultList.size());

        return page;
    }

mapper接口:

List<ResLineGroupDTO> getGroupDetail(Integer pageStart,Long pageSize,Long shopId);

xml:

<select id="getGroupDetail" resultType="com.huimei.bi.service.business_line.pojo.dto.response.ResLineGroupDTO">
        select gro.*, ifnull(gui.guider_count,0) as guider_count from hmcdata.bi_business_line_group gro
        left join (select group_id , count(1) as guider_count from hmcdata.bi_business_shopping_guide)gui
        on gro.id=gui.group_id
        <if test="shopId != null and shopId != ''">
            WHERE gro.shop_id=#{shopId}
        </if>
        LIMIT #{pageStart},#{pageSize}
    </select>

二.错误点

上面的写法查询出来的总数永远=pageSize,与符合查询条件的总数不符,使用mybatis-plus框架的方法:mapper方法中需要传入一个分页的对象 Ipage ,mapper方法返回也是一个分页对象Page,就能自动实现分页(具体原因、底层逻辑待后续研究)。不使用自定义的sql,就可以直接用BaseMapper自带的selectPage方法就可以。

三.修改后的代码

xml

 <select id="getGroupDetail" resultType="com.huimei.bi.service.business_line.pojo.dto.response.ResLineGroupDTO">
        select gro.*, ifnull(gui.guider_count,0) as guider_count from hmcdata.bi_business_line_group gro
        left join (select group_id , count(1) as guider_count from hmcdata.bi_business_shopping_guide)gui
        on gro.id=gui.group_id
        <if test="shopId != null and shopId != ''">
            WHERE gro.shop_id=#{shopId}
        </if>
    </select>

mapper:

Page<ResLineGroupDTO> getGroupDetail(IPage<ResLineGroupDTO> page, Long pageSize, Long shopId);

业务实现方法:

@Override
    public PageList<ResLineGroupDTO> groupList(Long current,Long pageSize,Long shopId) {

        Page<ResLineGroupDTO> page = new Page<>(current, pageSize);

        Page<ResLineGroupDTO> privateSphereGuiderGroupList=new Page<>();


        /*Integer pageStart = (current.intValue() - 1) * pageSize.intValue();*/

        List<ResLineGroupDTO> resultList = new ArrayList<ResLineGroupDTO>();

        //查询店铺的信息
        BusinessLineShopRelevance shop = this.getBaseMapper().selectById(shopId);

        if(Objects.isNull(shop)){
            throw new BizException("该店铺不存在");
        }
        if(shop.getPrivateSphereFlag()==1 || shop.getType()==2){
            //私域 拿的是 clickhouse private_sphere_group表中的数据
            privateSphereGuiderGroupList = biGuiderBoardMapper.getPrivateSphereGuiderGroupList(page, pageSize, shop.getBusinessUnitId());
            resultList =privateSphereGuiderGroupList.getRecords();
            //查询私域小组组长
            List<ResShoppingGuideDTO> leaderList = biGuiderBoardMapper.getPrivateSphereGuiderLeaderList();
            if(!leaderList.isEmpty()&&leaderList.size()>0){
                Map<Long, ResShoppingGuideDTO> leaderMap = leaderList.stream().collect(Collectors.toMap(ResShoppingGuideDTO::getGroupId, ResShoppingGuideDTO -> ResShoppingGuideDTO, (k1, k2) -> k2));
                //装配负责人信息
                if(!leaderMap.isEmpty()){
                    for(ResLineGroupDTO dto:resultList){
                        if(leaderMap.containsKey(dto.getId())){
                            ResShoppingGuideDTO dto2 = leaderMap.get(dto.getId());
                            ResPrincipalDTO dto1 = new ResPrincipalDTO(dto2.getId(),dto2.getGuiderEmployeeName());
                            List<ResPrincipalDTO> dtos = new ArrayList<>();
                            dtos.add(dto1);
                            dto.setPrincipalList(dtos);
                        }
                    }
                }
            }

        }else {
            //非私域
            privateSphereGuiderGroupList = businessLineGroupMapper.getGroupDetail(page, pageSize, shopId);
            resultList=privateSphereGuiderGroupList.getRecords();
            //查询负责人
            List<BusinessPrincipalList> principallist =businessPrincipalListMapper.getGroupPricipalListByShopId(shopId);

            if(!principallist.isEmpty()&&principallist.size()>0){
                Map<Long, List<BusinessPrincipalList>> principalmap = principallist.stream().collect(Collectors.groupingBy(BusinessPrincipalList::getBusinessId));
                if(!principalmap.isEmpty()){
                    for(ResLineGroupDTO dto:resultList){

                        if(principalmap.containsKey(dto.getId())){
                            List<ResPrincipalDTO> dtos = new ArrayList<>();
                            List<BusinessPrincipalList> principalLists = principalmap.get(dto.getId());

                            principalLists.forEach(it->{
                                ResPrincipalDTO dto1 = new ResPrincipalDTO();

                                dto1.setId(it.getEmployeeId());
                                dto1.setName(it.getName());

                                dtos.add(dto1);

                            });


                            dto.setPrincipalList(dtos);
                        }



                    }
                }
            }

        }
        for(ResLineGroupDTO dto:resultList){
            dto.setShopName(shop.getName());
        }

        privateSphereGuiderGroupList.setRecords(resultList);

        return new PageList<>(privateSphereGuiderGroupList);

    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

错误的分页写法及修改 的相关文章

  • 通过Zuul上传大文件

    我在通过 zuul 上传大文件时遇到问题 我正在使用 apache commons 文件上传 https commons apache org proper commons fileupload https commons apache o
  • 无法使用 datastax java 驱动程序通过 UDT 密钥从 cassandra 检索

    我正在尝试使用用户定义的类型作为分区键将对象存储在 cassandra 中 我正在使用 datastax java 驱动程序进行对象映射 虽然我能够插入到数据库中 但无法检索该对象 如果我更改分区键以使用非 udt 例如文本 我就能够保存和
  • mysql 在 sum() 函数上使用 concat,例如 concat(sum(col1),"%")

    我正在尝试合并多个查询 但其中一个查询使用 sum 当我尝试在此列上应用 concat 时 我得到不需要的 blob 结果 我如何在聚合列上应用 concat 和 union 我期待这个结果 SELECT row 1 col1 UNION
  • 自定义列表字段点击事件

    我正在编写一个应用程序 其中我创建了用于显示列表视图的自定义列表字段 我的 CustomListField 包含连续的一个图像和文本 我正在通过单击列表字段行获取字段更改侦听器 但我也想将字段更改侦听器放在图像上 谁能告诉我我该怎么做 这是
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f
  • SQL如何将两个日期之间一小时内的事件相加并显示在一行中

    我正在使用 C 和 SQL Server 2005 开发一份报告 我只需显示我们每小时获得的点击次数 桌子很大 输出应如下所示 Row Date Time Hit Count 1 07 05 2012 8 00 3 2 07 05 2012
  • 将类转换为 JSONObject

    我有好几堂这样的课 我想将类转换为 JSONObject 格式 import java io Serializable import com google gson annotations SerializedName public cla
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • 2^31 次方的 Java 指数错误 [重复]

    这个问题在这里已经有答案了 我正在编写一个java程序来输出2的指数幂 顺便说一句 我不能使用Math pow 但是在 2 31 和 2 32 处我得到了其他东西 另外 我不打算接受负整数 My code class PrintPowers
  • 使用 JDBC 连接到 PostgreSql 的本地实例

    我在 Linux 机器上有一个正在运行的 PostgreSql 本地实例 当我使用psql来自 shell 的命令我成功登录 没有任何问题 我需要通过 JDBC 连接到 PostgreSql 但我不知道我到底应该传递什么url参数为Driv
  • 如何在 IntelliJ IDEA 中运行 akka actor

    来自 Akka 网站文档 然后 这个主要方法将创建所需的基础设施 运行演员 启动给定的主要演员并安排 一旦主要参与者终止 整个应用程序就会关闭 因此 您将能够使用类似于以下的命令运行上面的代码 下列的 java classpath akka
  • IntelliJ Idea:将简单的 Java servlet(无 JSP)部署到 Tomcat 7

    我尝试按照教程进行操作here http wiki jetbrains net intellij Creating a simple Web application and deploying it to Tomcat部署 servlet
  • 使用 Proguard 通过 Dropbox.com 库混淆 Android 应用程序

    我刚刚创建了一个需要 Dropbox com API 库的 Android 应用程序 我现在尝试在 发布 模式下构建应用程序 并希望在代码上运行混淆器以对其进行混淆 但是 每当我尝试运行 Proguard 时 都会收到以下错误 Progua
  • 类更改(例如字段添加或删除)是否保持 Serialized 的向后兼容性?

    我有一个关于 Java 序列化的问题 在这种情况下 您可能需要修改可序列化类并保持向后兼容性 我有丰富的 C 经验 所以请允许我将 Java 与 NET 进行比较 在我的Java场景中 我需要使用Java的运行时序列化机制序列化一个对象 并
  • SQL Server:触发器如何读取插入、更新、删除的值

    我在一张表中有触发器并且想阅读UserId插入 更新或删除行时的值 怎么做 下面的代码不起作用 我收到错误UPDATED ALTER TRIGGER dbo UpdateUserCreditsLeft ON dbo Order AFTER
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • titledBorder 标题中的图标

    您好 是否可以在 titledBorder 的标题中放置一个图标 例如以下代码 import java awt GridLayout import javax swing JFrame import javax swing JLabel i
  • 返回年份数组作为年份范围

    我正在尝试查询一个包含以下内容的表character varying 年份列 并将这些年份作为逗号分隔的年份范围字符串返回 年份范围将由数组中存在的连续年份确定 不连续的年份 年份范围应以逗号分隔 数据类型的原因是character var
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • Java 的“&&”与“&”运算符

    我使用的示例来自 Java Herbert Schildt 的完整参考文献 第 12 版 Java 是 14 他给出了以下 2 个示例 如果阻止 第一个是好的 第二个是错误的 因此发表评论 public class PatternMatch

随机推荐

  • 3.git 将本地仓库推到远程

    1 创建一个本地仓库 git init 2 把文件添加到版本仓库中 git add 3 生成提交记录 git commit m git init 4 关联到远程库 git remote add origin 你的远程库 5 获取远程库与本地
  • jsoncpp封装和解析字符串、数字、布尔值和数组

    使用jsoncpp进行字符串 数字 布尔值和数组的封装与解析 1 下载jsoncpp的代码库 百度网盘地址 http pan baidu com s 1ntqQhIT 2 解压缩文件 jsoncpp rar unzip jsoncpp ra
  • 解决BeanNotOfRequiredTypeException办法(@Autowired和@Resource注解的不同)

    1 错误信息 org springframework beans factory BeanNotOfRequiredTypeException Bean named aisleService must be of type com gdie
  • Nmap源码分析(主机发现)

    Nmap源码分析 主机发现 2012年8月9日 Nmap在进行真正的端口扫描之前 通常需要确定目标主机是否在线 主机发现过程 以免发送大量探测包到不在线的主机 主机发现作为Nmap的基本功能之一 用户也可以单独运用 例如 仅仅需要确定局域网
  • 盘点3款超好用的免费录屏软件,快来看!

    在现代数字化社会中 录屏软件成为了各行各业中必备的工具之一 用于记录操作步骤 制作教程 分享游戏精彩瞬间等 而寻找一款免费的 功能强大的录屏软件也变得越来越重要 本文将为您介绍3款免费录屏软件 并详细说明使用步骤 帮助您找到适合自己需求的录
  • 制作OLED图标

    制作OLED图标 陈拓 2021 06 24 2021 06 26 1 概述 制作用于OLED显示的图标 获取C语言图像点阵数据 2 图标库 先准备图标图像 可以从图标库中找需要的图案 下面两个是我常用的图标网站 2 1 Font Awes
  • 什么是gdb,gdb的简单用法

    在Linux中 gdb是GNU调试器 GNU debugger 的缩写 它是一个强大的命令行调试工具 用于调试C C 和其他编程语言的程序 使用gdb可以执行以下任务 启动程序并逐行执行代码 设置断点 以便在特定位置停止程序执行 检查变量的
  • php漏洞eval,Web安全之代码执行漏洞

    原标题 Web安全之代码执行漏洞 内容 1 代码执行漏洞的概述 2 代码执行漏洞的危害 3 代码执行漏洞的利用 4 代码执行漏洞的防御 背景介绍 在Web应用中有时候程序员为了考虑灵活性 简洁性 会在代码调用eval函数 PHP函数 去处理
  • oracle imp lrm 00101,LRM-00101: unknown parameter name解决办法

    LRM 00101 unknown parameter name解决方法 点击右边红色标题查看本文完整版 LRM 00101 unknown parameter name解决方法 SQL gt startup pfile d oracle
  • 2023华为od机试 Python【比赛冠军】

    题目 我们现在有若干个运动员 每个运动员有自己独特的id 每个运动员的能力不同 比赛按照如下规则进行 0号和1号 2号和3号 以此类推 在每一轮比赛中 获胜的进入下轮 输入描述 输入一行N个数字代表N的运动员的实力值 输出冠亚季军的id 用
  • 逻辑思维训练题

    1 估算你所在城市理发店的数量 https www jianshu com p 1431daad2c62 这种思维方式的核心 就是把你要探索的结果用一个数理公式展示出来 我们用最开始的煎饼摊例子来看怎么算 就要用到 利润 收入 变动成本 而
  • 用于包管理的基本命令APT-GET和APT-CACHE

    这篇文章解释你如何快速学习从命令行使用apt get和apt cache安装 移除 升级和搜索软件包 这篇文章提供一些有用命令 它们将帮助你在基于Debian Ubuntu的系统中处理包管理 apt get是什么 apt get工具是一个强
  • Flutter基础Dart单例的实现

    引言 在日常开发搭建基础框架时 常常用到全局使用的数据类或者工具类 比如日期工具类 地图工具类等 在项目一般使用几种单例类来分享心得 有类实例方式 工厂方式以及类静态方式 实例方式 使用DartPad cn网站来练习dart简单代码片段还是
  • [QT编程系列-40]:QML语言简介

    目录 第1章 简介 第2章 QT QML示例 第三章 QML的步骤 第1章 简介 QML Qt Meta Object Language 是Qt框架中用于构建用户界面的声明性语言 它是一个轻量级的语言 用于描述界面的结构和行为 使开发人员能
  • 樱花动漫中的视频下载分析

    昨天有个朋友问我樱花动漫中的视频怎么下载 那么今天我就写篇文章来专门分析下樱花动漫中的视频是怎么下载的 1 还是打开我们的马赛克视频助手 来分析樱花动漫的数据包 当然你们也没有用其他的抓包工具 不过我习惯了用这个 可以使用它的转到来源功能
  • EPI distortion correction形变矫正, eddy, fieldmap等五种不同方法

    EPI distortion correction形变矫正 1 topup eddy 2 fieldmap eddy 2 1 对mag做去脑壳 2 2 基于去过脑壳的mag 1volume bet nii gz数据 对fieldmap进行预
  • STM32 FLASH操作

    STM32 的闪存模块由 主存储器 信息块和闪存存储器接口寄存器等 3 部分组成 主存储器 该部分用来存放代码和数据常数 如 const 类型的数据 对于大容量产品 其被划分为 256 页 每页 2K 字节 注意 小容量和中容量产品则每页只
  • 解决iframe在ios中无法滚动的bug

    在解决iframe在ios无法滚动的bug中 需要在iframe外面包裹一层div 如下 div class scroll wrapper div 然后设置scroll wrapper的样式 给scroll wrapper添加 webkit
  • camunda 流程引擎如何开始并行任务,且有哪些实现方式?

    认识并行任务 在流程引擎开发中 稍微复杂一点的项目都会遇到并行任务 什么是并行任务呢 就是在完成一个流程节点后 下一步会同时开始多个任务 且任务与任务之间互不影响 这个说起来真的有点绕 刚开始我真不理解 试了好多次才想明白 下面就画2条不同
  • 错误的分页写法及修改

    一 错误的写法 api GetMapping groupList ApiImplicitParams ApiImplicitParam name current value 页码 required true dataType Long da