交代一下前言,数据是redis中查询

Java表格页末有本页总计怎么去掉表格框生成pdf模板_分页


140,193,88,117 格式大概是这样。 需要切割为long类型的list数组。需要手动计算分页,去mongodb中查询数据。


 

这里我用的手动计算分页的是 hutool 工具包


import cn.hutool.core.util.PageUtil; 里面挺多实用的工具


<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
</dependency>


int[] ints = PageUtil.transToStartEnd(page - 1, pageSize);


传入页码,和数据条数,计算数据起始位置

 将页数和每页条目数转换为开始位置和结束位置 此方法用于包括结束位置的分页方法 例如:
       页码:0,每页10 =》 [0, 10]
       页码:1,每页10 =》 [10, 20]
       ……
       
当setFirstPageNo(int)设置为1时:
       页码:1,每页10 =》 [0, 10]
       页码:2,每页10 =》 [10, 20]
       ……
      
Params:
pageNo – 页码(从0计数)
pageSize – 每页条目数
Returns:
第一个数为开始位置,第二个数为结束位置

int[] ints = PageUtil.transToStartEnd(page - 1, pageSize);

通过工具返回起始页码。

//根据起点, 和 终点, 截取到中间的vid 查询
            List<Long> vids = split.stream().skip(ints[0]).limit(ints[1]).map(Long::valueOf).collect(Collectors.toList());

通过stream 流。搭配分页工具。 实现手动分页。 .map(Long::valueOf) 将string 转为Long 类型


collect(Collectors.toList()); 收集到分页之后的数据。如果起始位置超出list集合的size 不为报错。结束位置超出list的size 不会出错。 但是size为0 。 if (vids.size() > 0) { 判断一下。进行下面的步骤。


其实罗里吧嗦一大堆,代码就两行。

//   将页数和每页条目数转换为开始位置和结束位置 此方法用于包括结束位置的分页方法 例如:   页码:0,每页10 =》 [0, 10]
            int[] ints = PageUtil.transToStartEnd(page - 1, pageSize);
            //根据起点, 和 终点, 截取到中间的vid 查询
            List<Long> vids = split.stream().skip(ints[0]).limit(ints[1]).map(Long::valueOf).collect(Collectors.toList());

 这里放一下这个方法的全部代码吧。

/**
     * 分页查询小视频列表,按照时间倒序排序 优先查询推荐的视频,如果没有推荐的视频或已经查询完成。再查询默认的
     *
     * @param userId   用户id
     * @param page     第几页
     * @param pageSize 每页几条
     * @return PageInfo<Video>
     */
    @Override
    public PageInfo<Video> queryVideoList(Long userId, Integer page, Integer pageSize) {
        //返回的结果集
        PageInfo<Video> pageInfo = new PageInfo<>();
        pageInfo.setPageNum(page);
        pageInfo.setPageSize(pageSize);

        //小视频推荐 redis key
        String redisKey = RedisKeyUtils.getVIDEOKEY(userId);
        //redis推荐视频vid  140,193,88,117, vid
        String redisValue = redisTemplate.opsForValue().get(redisKey);

        //如果redis中推荐的视频id不为空
        int recommendCount = 0;

            //如果redis 推荐视频不为空
        if (StringUtils.isNotEmpty(redisValue)) {
            //分割key
            List<String> split = StrUtil.split(redisValue, ',');

            //用于查找默认视频时,跳过的页数计算
            recommendCount = split.size();

            //   将页数和每页条目数转换为开始位置和结束位置 此方法用于包括结束位置的分页方法 例如:   页码:0,每页10 =》 [0, 10]
            int[] ints = PageUtil.transToStartEnd(page - 1, pageSize);
            //根据起点, 和 终点, 截取到中间的vid 查询
            List<Long> vids = split.stream().skip(ints[0]).limit(ints[1]).map(Long::valueOf).collect(Collectors.toList());

            //如果推荐视频vid 不为空,查询推荐视频
            if (vids.size() > 0) {
                Query query = Query.query(Criteria.where("vid").in(vids));
                List<Video> videos = mongoTemplate.find(query, Video.class);
                pageInfo.setRecords(videos);
                return pageInfo;
            }
        }

        //解决为了让默认视频从0开始,如果之前推荐视频已经刷到第四页。这里需要减去4,包装从0页往下查询
        int totalPage = PageUtil.totalPage(recommendCount, pageSize);
        //如果推荐视频为空,或查询完毕,查询返回默认的视频列表
        PageRequest pageRequest = PageRequest.of(page - totalPage - 1, pageSize,
                Sort.by(Sort.Order.desc("created")));
        Query query = new Query();
        query.with(pageRequest);
        List<Video> videos = mongoTemplate.find(query, Video.class);
        pageInfo.setRecords(videos);
        return pageInfo;

    }