MongoDb 分页 SpringDataPageable MongoRepository

来源:互联网 发布:雕刻机路径编程软件 编辑:程序博客网 时间:2024/06/06 04:41

文章背景说明:

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

前期准备:

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

      

Xml代码  收藏代码
  1. <dependency>  
  2.         <groupId>org.springframework.data</groupId>  
  3.         <artifactId>spring-data-mongodb</artifactId>  
  4.         <version>1.2.0.RELEASE</version>  
  5. </dependency>  

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

Java代码  收藏代码
  1. import java.io.Serializable;  
  2. import org.springframework.data.domain.Pageable;  
  3. import org.springframework.data.domain.Sort;  
  4.    
  5. public class SpringDataPageable implements Serializable, Pageable {  
  6.     private static final long serialVersionUID = xxxxxx;  
  7.     // 当前页  
  8.     private Integer pagenumber = 1;  
  9.     // 当前页面条数  
  10.     private Integer pagesize = 10;  
  11.     //排序条件  
  12.     private Sort sort;  
  13.       
  14.     public void setSort(Sort sort) {  
  15.         this.sort = sort;  
  16.     }  
  17.     // 当前页面  
  18.     @Override  
  19.     public int getPageNumber() {  
  20.         return getPagenumber();  
  21.     }  
  22.     // 每一页显示的条数  
  23.     @Override  
  24.     public int getPageSize() {  
  25.         return getPagesize();  
  26.     }  
  27.     // 第二页所需要增加的数量  
  28.     @Override  
  29.     public int getOffset() {  
  30.         return (getPagenumber() - 1) * getPagesize();  
  31.     }  
  32.     @Override  
  33.     public Sort getSort() {  
  34.         return sort;  
  35.     }  
  36.     public Integer getPagenumber() {  
  37.         return pagenumber;  
  38.     }  
  39.     public void setPagenumber(Integer pagenumber) {  
  40.         this.pagenumber = pagenumber;  
  41.     }  
  42.     public Integer getPagesize() {  
  43.         return pagesize;  
  44.     }  
  45.     public void setPagesize(Integer pagesize) {  
  46.         this.pagesize = pagesize;  
  47.     }  
  48. }  

 

 

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

第一方案:基于MongoRepository

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

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

Java代码  收藏代码
  1. import org.joda.time.DateTime;  
  2. import org.springframework.data.domain.Page;  
  3. import org.springframework.data.domain.Pageable;  
  4. import org.springframework.data.domain.Sort;  
  5. import org.springframework.data.mongodb.repository.MongoRepository;  
  6. import org.springframework.stereotype.Repository;  
  7.   
  8. @Repository  
  9. public interface PictureDataDetailRepository extends MongoRepository<T, String> {  
  10.     /** 
  11.      * 根据 sid字段分页查询 --- 根据方法名的命名规范来进行方法定义查询 
  12.      * @param sid 
  13.      * @param pageable  SpringDataPageable  
  14.      * @return 
  15.      */  
  16.     public Page<T> findBySid(Long sid, Pageable pageable);  
  17.     /** 
  18.      * 根据 sid字段和时间段进行分页查询--- 根据方法名的命名规范来进行方法定义查询 
  19.      * @param sid 
  20.      * @param beginTime 开始时间 
  21.      * @param endTime 结束时间 
  22.      * @param pageable 
  23.      * @return 
  24.      */  
  25.      public Page<T> findBySidAndCreateTimeBetween(Long sid,DateTime beginTime,DateTime endTime, Pageable pageable);  
  26.      /** 
  27.       * 根据 sid字段和标题进行模糊查询--- 根据方法名的命名规范来进行方法定义查询 
  28.       * @param sid 
  29.       * @param title 标题  
  30.       * @param pageable   
  31.       * @return 
  32.       */  
  33.       public Page<PictureDataDetail> findBySidAndTitleLike(Long sid,String title, Pageable pageable);  
  34.       
  35.      /** 
  36.   
  37.   
  38.       *   未找到Long类型的参数注解格式该如何辨析 
  39.       *   <strong>以注解方式存在一个技术难点想了好久一直没有攻破,特在此说明一下本人在使用注解方式没有找到以MongoDB中NumerLong类型的字段为参数时注解格式该如何编写!还望知道的可以加以指点?  
  40. </strong>      * 
  41.       * 根据 tid和标题模糊、时间段分页查询  -- 根据方法的注解方式来进行查询跟方法名称无关 
  42.       * @param tid 
  43.       * @param title 标题 --根据标题进行模糊查询 
  44.       * @param beginTime 开始时间    -----时间段查询 
  45.       * @param endTime 结束时间 
  46.       * @param pageable  SpringDataPageable  
  47.       * @return 
  48.       */  
  49.       @Query(value="{'tid':?0,'title':{'$regex':?1,'$options':'i'},createTime':{'$gt':?2,'$lt':?3}}")  
  50.       public Page<T> query(String tid,String title,DateTime beginTime,DateTime endTime, Pageable pageable);  
  51.       
  52. }  

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

   

Java代码  收藏代码
  1. import org.springframework.data.domain.Page;  
  2. import org.springframework.data.domain.Sort;  
  3. import org.springframework.data.domain.Sort.Order;  
  4.       
  5. SpringDataPageable pageable = new SpringDataPageable();  
  6. List<Order> orders = new ArrayList<Order>();  
  7. orders.add(new Order(Direction.DESC, new Order(Direction.DESC, "createTime")));  
  8. pageable.setSort(new Sort(orders));  
  9. //每页显示条数  
  10. pageable.setPagesize(queryBean.getPage().getSize());  
  11. //当前页  
  12. pageable.setPagenumber(queryBean.getPage().getStart());  
  13. Page<t> page = repositoryDao.findBySid(183l,pageable);  
  14. //SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
  15. //DateTime d =  DateTime.parse(sdf.format(new Date()));  

 

 

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

  

Java代码  收藏代码
  1. import org.springframework.beans.factory.annotation.Autowired;  
  2. import org.springframework.data.domain.Page;  
  3. import org.springframework.data.domain.PageImpl;  
  4. import org.springframework.data.domain.Sort;  
  5. import org.springframework.data.domain.Sort.Direction;  
  6. import org.springframework.data.domain.Sort.Order;  
  7. import org.springframework.data.mongodb.core.MongoTemplate;  
  8. import org.springframework.data.mongodb.core.query.Criteria;  
  9. import org.springframework.data.mongodb.core.query.Query;  
  10.   
  11.  @Autowired  
  12.  MongoTemplate template;  
  13.   
  14.  public List<T> query(){  
  15.    
  16.          //SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
  17.          DateTime d1 =  DateTime.parse(sdf.format(new Date()));  
  18.          DateTime d2 =  DateTime.parse(sdf.format(new Date()));  
  19.         Query query = new Query();  
  20.         Criteria criteria = new Criteria();  
  21.     //sid查询  
  22.         criteria.and("sid").is(183l);  
  23.     //模糊查询  
  24.         criteria.and("title").regex(".*?"+"fileName"+".*");  
  25.     //时间段查询  
  26.         criteria.and("createTime").gte(d1).lte(d2);  
  27.         List<Order> orders = new ArrayList<Order>();  
  28.         orders.add(new Order(Direction.DESC, "createTime"));  
  29.         Sort sort = new Sort(orders);  
  30.         if (null != sort) {  
  31.             query.with(sort);  
  32.         }  
  33.         query.addCriteria(criteria);  
  34.           
  35.     SpringDataPageable pageable = new SpringDataPageable();  
  36.     //开始页  
  37.         pageable.setPagenumber(0);  
  38.     //每页条数  
  39.         pageable.setPagesize(10);  
  40.     //排序  
  41.         pageable.setSort(sort);  
  42.     //查询出一共的条数  
  43.         Long count =  template.count(query, T.class);  
  44.     //查询  
  45.         List<T> list = template.find(query.with(pageable), T.class);  
  46.     //将集合与分页结果封装  
  47.         Page<T> pagelist = new PageImpl<T>(list, pageable, count);  
  48.         return pagelist;  
  49.     }  

 

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

 

原创粉丝点击