`
TimerBin
  • 浏览: 360954 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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;
    }
    // 当前页面
    @Override
    public int getPageNumber() {
        return getPagenumber();
    }
    // 每一页显示的条数
    @Override
    public int getPageSize() {
        return getPagesize();
    }
    // 第二页所需要增加的数量
    @Override
    public int getOffset() {
        return (getPagenumber() - 1) * getPagesize();
    }
    @Override
    public 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;

 @Autowired
 MongoTemplate 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客户端工具MongoVUE 1.5.3破解

    mongoDB客户端工具MongoVUE 1.5.3破解 破解方法见"破解方法.txt

    mongo-page-helper:MongoDB分页插件

    MongoDB分页插件 为MongoDB提供了开箱即用的分页能力. 详情参见我的博客 How to use Maven for instance. &lt;repository&gt; &lt;id&gt;jitpack.io &lt;url&gt;https://jitpack.io&lt;/url&gt; &lt;/repository&gt; For the latest release ...

    MongoRepository:具有扩展功能的MongoDB的存储库模式

    Mongo存储库具有扩展功能的MongoDB的存储库模式MongoDB驱动程序版本2.11.4定义模型您不需要创建模型,但是如果这样做,则需要扩展Entity // If you are able to define your modelpublic class User : Entity { ...

    MongoDB.Net工具库MongoRepository使用方法详解

    MongoDB .Net工具库MongoRepository的简单使用。 最近研究了一下MongoDB数据库,并使用了开源的在.net环境下的一个类库,Mongo仓库。对于数据的一些简单的操作非常好用,特记录供后期参考。 具体的使用过程如下: 一...

    MongoDB管理工具 MongoVUE1.4

    MongoDB管理工具 MongoVUE1.4,很好用的管理工具。

    MongoDB分页插件

    MongoDB分页插件是专为MongoDB数据库设计的一个实用工具,主要目的是为了方便开发者在进行数据查询时实现高效、灵活的分页功能。在Java开发中,数据库操作是不可或缺的一部分,而面对大量数据时,分页显示尤为重要,...

    SpringBoot整合mongodb学习MongoTemplate和MongoRepository两种方式CRUD使用.zip

    mongodb 数据库基本操作 1、mongoDB的介绍 mongoDB是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。它介于关系数据库和非关系数据库之间,被认为是非...

    MongoRepository:使用C#,MongoDb实现存储库模式

    MongoRepository是针对MongoDB数据库的一种实现,用于在C#环境中应用存储库模式。存储库模式是一种设计模式,它提供了一种抽象数据访问层的方式,使应用程序与数据存储机制解耦,提高了代码的可测试性和可维护性。在...

    Api-MongoRepository.zip

    Api-MongoRepository.zip,官方mongodb c driverproject描述之上的存储库抽象层,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信。通过提取实现并将数据放弃到对象...

    mongodb的工具mongovue

    mongodb的工具mongovued安装包,含有激活方式

    SpringBoot整合MongoDB快速上手文档.zip

    在SpringBoot中,MongoDB的访问主要通过`MongoRepository`接口实现。这是一个基于Spring Data JPA的Repository抽象,可以自动生成CRUD操作。首先定义一个Repository接口,继承`MongoRepository`,并提供实体类和ID...

    MongoDB 客户端工具 MongoVue

    MongoVUE是一个MongoDB在windwos下的客户端管理工具 MongoVUE是一个创新的MongoDB桌面应用Windows操作系统,给你一个优雅的、高度可用的GUI界面来使用MongoDB。现在有一个更少的担心在管理你的网络数据。 ngoVUE使...

    MongoDB安装配置MongoVUE

    ### MongoDB 安装与配置详解及使用MongoVUE进行连接 #### 一、MongoDB简介与安装 **MongoDB** 是一种开源文档型数据库,它使用JSON格式的文档存储数据,具有高性能、高可用性和易扩展性等特点。适用于大数据量、高...

    MongoDB安装包

    安装完成后,可以使用MongoDB的命令行工具`mongo`与数据库进行交互,执行增删改查等操作。例如,创建数据库`use mydb`,插入文档`db.mycol.insert({name:"John", age:30})`。 此外,MongoDB还支持复制集(Replica ...

    mongodb driver 集成mongo和mongodb扩展 log.php 发送日志类

    "集成mongo和mongodb扩展"通常是指在代码中同时使用了旧的mongo扩展和新的mongodb扩展。虽然不推荐,但在过渡期间可能有必要这样做,以确保与旧代码库的兼容性。新的mongodb扩展设计时考虑到了向后兼容,但仍然建议...

    mongodb linux 搭建mongo 主从配置安装手册

    /usr/local/northeasttycoon/mongodb/bin/mongod --dbpath=/usr/local/northeasttycoon/mongodb/data --logpath=/usr/local/northeasttycoon/mongodb/log/mongo.log –logappend --port=27017 --master & ...

    JAVA代码实现MongoDB动态条件之分页查询

    首先,需要定义一个继承了MongoRepository的接口,用于对学生信息的操作: public interface StudentRepository extends MongoRepository, String&gt; { } 然后,使用QueryByExampleExecutor中的findAll方法来执行...

    使用MyBatisPlus的方式,优雅的操作MongoDB,可和现有Mongo框架结合使用,无侵入性

    使用MyBatisPlus的方式,优雅的操作MongoDB,可和现有Mongo框架结合使用,无侵入性 简化开发, 只需简单配置,即可快速进行CRUD操作,链式调用更加便捷。只做增强不做改变,引入它不会对现有工程产生影响,如丝般...

    高效mongodb的php分页类(不使用skip).zip

    介绍了高效mongodb的php分页类,并且没有使用mongodb的skip来实现分页,需要的朋友可以参考下,mongodb分页skip limit分页要先查出所有结果再去跳过,这样如果查询页面越往后效率越低。 如果能够通过查询条件查出...

    DBeaver新增MongoDB驱动

    MongoDB驱动

Global site tag (gtag.js) - Google Analytics