使用java进行List分页查询

学习大佬博客:https://blog.csdn.net/as875784622/article/details/81031470,这篇博客非常好,强推

前提

       后台的首页公告,一个首页公告可以发布好几个城市,按理来说,存一个首页公告时有一个字段要存下所有的发布城市,那么这个首页公告就在数据库里只有一条记录就行了,但是实际上存的是一个城市一条记录,那么就是比如说我一个首页公告发布了2个城市,那么现在存库的时候库里就有两条记录,除了发布城市的cityCode码不同外,其他首页公告的属性信息比如说名称,跳转链接和是否生效以及公告图片都相同,但是实际在分页查询的时候是一个首页公告名称只显示一条记录,那些多个的发布城市已经被一个字段给代替了

数据库里的存储

                             

原型

                         

思路

           先根据条件从数据库里查出所有的满足条件的记录,再进行java级别的分页显示

代码

/**
     * 后台分页查询
     *
     * @param noticeQuery 首页公告查询
     * @return 结果集
     */
    @PostMapping("/listByNotices")
    public CommonRes<PageModel<List<NoticeQueryPageVo>>> listByNotices(
            @RequestHeader("X-Token") String token,
            @RequestBody NoticeQuery noticeQuery) throws Exception {
        logger.info("[首页公告] 首页公告入参为{}", noticeQuery.toString());
        // 分页参数初始化
        initDefaultPageParameter(noticeQuery);
        PageModel<List<NoticeQueryPageVo>> noticeQueryPageVoPageModel = new PageModel<>();
        try {
            //满足条件的所有数据
            List<NoticeDTO> list = noticeService.listByNotice(noticeQuery);
            logger.info("首页公告数据库查询结果出参为{}", JsonUtil.toJson(list));
            List<NoticeQueryPageVo> noticeQueryPageVos = new ArrayList<>();

            if (list.size() <= 0) {
                noticeQueryPageVoPageModel.setCount(0);
                noticeQueryPageVoPageModel.setBody(noticeQueryPageVos);
                noticeQueryPageVoPageModel.setPageSize(noticeQuery.getPageSize());
                noticeQueryPageVoPageModel.setCurrentPage(noticeQuery.getCurrentPage());
                return CommonRes.success(noticeQueryPageVoPageModel);
            }

            List<String> collect = list.stream().filter((listDo) -> {
                return StringUtils.hasText(listDo.getTitle());
            }).distinct().map(listDo -> {
                return listDo.getTitle().trim();
            }).distinct().collect(Collectors.toList());
            logger.info("去重的首页公告名称出参为{}", JsonUtil.toJson(collect));

            for (String s : collect) {
                List<Integer> cityCode = new ArrayList<>();
                NoticeQueryPageVo noticeQueryPageVo = new NoticeQueryPageVo();
                for (NoticeDTO dto : list) {
                    if (s.trim().equals(dto.getTitle().trim())) {
                        cityCode.add(dto.getCityCode());
                        BeanUtils.copyProperties(dto, noticeQueryPageVo);
                    }
                }
                cityCode = cityCode.stream().distinct().collect(Collectors.toList());
                noticeQueryPageVo.setCityCode(cityCode);
                noticeQueryPageVos.add(noticeQueryPageVo);
            }
            logger.info("满足首页公告查询的最终数据为{}", JsonUtil.toJson(noticeQueryPageVos));

            int count = noticeQueryPageVos.size();
            int totalPage = count % noticeQuery.getPageSize(); // 一共多少页
            if (totalPage > 0) {
                totalPage = count / noticeQuery.getPageSize() + 1;
            } else {
                totalPage = count / noticeQuery.getPageSize();
            }
            Integer currentPage = totalPage > noticeQuery.getCurrentPage() ? noticeQuery.getCurrentPage() : totalPage;
            int fromIndex = (currentPage - 1) * noticeQuery.getPageSize();
            int toIndex = currentPage * noticeQuery.getPageSize() > count ? count : currentPage * noticeQuery.getPageSize();

            noticeQueryPageVos = noticeQueryPageVos.subList(fromIndex, toIndex);
            noticeQueryPageVoPageModel.setCount(count);
            noticeQueryPageVoPageModel.setBody(noticeQueryPageVos);
            noticeQueryPageVoPageModel.setPageSize(noticeQuery.getPageSize());
            noticeQueryPageVoPageModel.setCurrentPage(noticeQuery.getCurrentPage());
            logger.info("首页公告分页查询出参为,result:{}", JsonUtil.toJson(noticeQueryPageVoPageModel));
        } catch (Exception e) {
            logger.error("[首页公告] 分页查询 error:{}", e.getMessage());
        }
        return CommonRes.success(noticeQueryPageVoPageModel);
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值