MongoDb 分页 SpringDataPageable MongoRepository

2024-04-09 16:38

本文主要是介绍MongoDb 分页 SpringDataPageable MongoRepository,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章背景说明:

       在使用Spring的环境下使用MongoDB进行分页查询。

前期准备:

1、在Spring中已经为MongoDB的查询提供了工具包,Maven目录如下所示:

      

<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-mongodb</artifactId><version>1.2.0.RELEASE</version>
</dependency>

2、定义公用分页参数类---需要实现Pageable 接口实现其方法

import java.io.Serializable;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;public class SpringDataPageable implements Serializable, Pageable {private static final long serialVersionUID = xxxxxx;// 当前页private Integer pagenumber = 1;// 当前页面条数private Integer pagesize = 10;//排序条件private Sort sort;public void setSort(Sort sort) {this.sort = sort;}// 当前页面@Overridepublic int getPageNumber() {return getPagenumber();}// 每一页显示的条数@Overridepublic int getPageSize() {return getPagesize();}// 第二页所需要增加的数量@Overridepublic int getOffset() {return (getPagenumber() - 1) * getPagesize();}@Overridepublic Sort getSort() {return sort;}public Integer getPagenumber() {return pagenumber;}public void setPagenumber(Integer pagenumber) {this.pagenumber = pagenumber;}public Integer getPagesize() {return pagesize;}public void setPagesize(Integer pagesize) {this.pagesize = pagesize;}
}

 

 

基于工具包spring-data-mongodb来进行MongoDB分页查询

第一方案:基于MongoRepository

                  优势:方便简单,方法实现由工具类完成。缺点:不适合多个可变查询条件。

    定义的相当于Dao的类源码如下所示:DateTime(joda-time/joda-time/2.3/joda-time-2.3-sources.jar)

import org.joda.time.DateTime;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;@Repository
public interface PictureDataDetailRepository extends MongoRepository<T, String> {/*** 根据 sid字段分页查询 --- 根据方法名的命名规范来进行方法定义查询* @param sid* @param pageable  SpringDataPageable * @return*/public Page<T> findBySid(Long sid, Pageable pageable);/*** 根据 sid字段和时间段进行分页查询--- 根据方法名的命名规范来进行方法定义查询* @param sid* @param beginTime 开始时间* @param endTime 结束时间* @param pageable* @return*/public Page<T> findBySidAndCreateTimeBetween(Long sid,DateTime beginTime,DateTime endTime, Pageable pageable);/*** 根据 sid字段和标题进行模糊查询--- 根据方法名的命名规范来进行方法定义查询* @param sid* @param title 标题 * @param pageable  * @return*/public Page<PictureDataDetail> findBySidAndTitleLike(Long sid,String title, Pageable pageable);/***   未找到Long类型的参数注解格式该如何辨析*   以注解方式存在一个技术难点想了好久一直没有攻破,特在此说明一下本人在使用注解方式没有找到以MongoDB中NumerLong类型的字段为参数时注解格式该如何编写!还望知道的可以加以指点? 
      ** 根据 tid和标题模糊、时间段分页查询  -- 根据方法的注解方式来进行查询跟方法名称无关* @param tid* @param title 标题 --根据标题进行模糊查询* @param beginTime 开始时间    -----时间段查询* @param endTime 结束时间* @param pageable  SpringDataPageable * @return*/@Query(value="{'tid':?0,'title':{'$regex':?1,'$options':'i'},createTime':{'$gt':?2,'$lt':?3}}")public Page<T> query(String tid,String title,DateTime beginTime,DateTime endTime, Pageable pageable);}

    调用时简单代码如下所示:

   

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Order;SpringDataPageable pageable = new SpringDataPageable();
List<Order> orders = new ArrayList<Order>();
orders.add(new Order(Direction.DESC, new Order(Direction.DESC, "createTime")));
pageable.setSort(new Sort(orders));
//每页显示条数
pageable.setPagesize(queryBean.getPage().getSize());
//当前页
pageable.setPagenumber(queryBean.getPage().getStart());
Page<t> page = repositoryDao.findBySid(183l,pageable);
//SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//DateTime d =  DateTime.parse(sdf.format(new Date()));

 

 

 第二方案:Query、Criteria、MongoTemplate,来进行手动编码指定查询条件分页,优点不废话直接上代码。

  

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.domain.Sort.Order;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;@AutowiredMongoTemplate template;public List<T> query(){//SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");DateTime d1 =  DateTime.parse(sdf.format(new Date()));DateTime d2 =  DateTime.parse(sdf.format(new Date()));Query query = new Query();Criteria criteria = new Criteria();//sid查询criteria.and("sid").is(183l);//模糊查询criteria.and("title").regex(".*?"+"fileName"+".*");//时间段查询criteria.and("createTime").gte(d1).lte(d2);List<Order> orders = new ArrayList<Order>();orders.add(new Order(Direction.DESC, "createTime"));Sort sort = new Sort(orders);if (null != sort) {query.with(sort);}query.addCriteria(criteria);SpringDataPageable pageable = new SpringDataPageable();//开始页pageable.setPagenumber(0);//每页条数pageable.setPagesize(10);//排序pageable.setSort(sort);//查询出一共的条数Long count =  template.count(query, T.class);//查询List<T> list = template.find(query.with(pageable), T.class);//将集合与分页结果封装Page<T> pagelist = new PageImpl<T>(list, pageable, count);return pagelist;}

 

   以上为两种简单实现MongoDB 分页查询代码,在spring-data-mongodb还提供了多种公式供以查询使用,这里不做过多介绍。

 

这篇关于MongoDb 分页 SpringDataPageable MongoRepository的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/888680

相关文章

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

基于MongoDB实现文件的分布式存储

《基于MongoDB实现文件的分布式存储》分布式文件存储的方案有很多,今天分享一个基于mongodb数据库来实现文件的存储,mongodb支持分布式部署,以此来实现文件的分布式存储,需要的朋友可以参考... 目录一、引言二、GridFS 原理剖析三、Spring Boot 集成 GridFS3.1 添加依赖

MyBatis分页插件PageHelper深度解析与实践指南

《MyBatis分页插件PageHelper深度解析与实践指南》在数据库操作中,分页查询是最常见的需求之一,传统的分页方式通常有两种内存分页和SQL分页,MyBatis作为优秀的ORM框架,本身并未提... 目录1. 为什么需要分页插件?2. PageHelper简介3. PageHelper集成与配置3.

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

Mysql中深分页的五种常用方法整理

《Mysql中深分页的五种常用方法整理》在数据量非常大的情况下,深分页查询则变得很常见,这篇文章为大家整理了5个常用的方法,文中的示例代码讲解详细,大家可以根据自己的需求进行选择... 目录方案一:延迟关联 (Deferred Join)方案二:有序唯一键分页 (Cursor-based Paginatio

mybatis-plus分页无效问题解决

《mybatis-plus分页无效问题解决》本文主要介绍了mybatis-plus分页无效问题解决,原因是配置分页插件的版本问题,旧版本和新版本的MyBatis-Plus需要不同的分页配置,感兴趣的可... 昨天在做一www.chinasem.cn个新项目使用myBATis-plus分页一直失败,后来经过多方