交代一下前言,数据是redis中查询
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>*/@Overridepublic PageInfo<Video> queryVideoList(Long userId, Integer page, Integer pageSize) {//返回的结果集PageInfo<Video> pageInfo = new PageInfo<>();pageInfo.setPageNum(page);pageInfo.setPageSize(pageSize);//小视频推荐 redis keyString redisKey = RedisKeyUtils.getVIDEOKEY(userId);//redis推荐视频vid 140,193,88,117, vidString redisValue = redisTemplate.opsForValue().get(redisKey);//如果redis中推荐的视频id不为空int recommendCount = 0;//如果redis 推荐视频不为空if (StringUtils.isNotEmpty(redisValue)) {//分割keyList<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;}