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还提供了多种公式供以查询使用,这里不做过多介绍。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MongoRepository提供了一种方便的方式来进行分页查询。在使用MongoRepository进行分页查询时,你可以按照以下步骤进行操作: 1. 创建一个继承自MongoRepository的接口,例如StudentRepository。在接口中定义你的分页查询方法。例如,你可以使用getUserByAgeGreaterThan方法来查询年龄大于指定值的用户,并使用Pageable参数来指定分页信息。\[2\] 2. 在你的repository层的实现类中,使用MongoTemplate或者MongoClient来执行分页查询操作。你可以使用skip和limit方法来指定查询的起始位置和查询的数量。\[3\] 3. 在你的业务逻辑中,调用你定义的分页查询方法来获取分页结果。你可以通过Page对象来获取分页的数据和相关的分页信息。 总结起来,使用MongoRepository进行分页查询的步骤包括定义分页查询方法、在repository层实现分页查询逻辑、在业务逻辑中调用分页查询方法来获取分页结果。这样就可以方便地进行MongoDB分页查询了。 #### 引用[.reference_title] - *1* [springboot整和mogodb(MongoRepository)简单操作(增删改查,模糊、条件和分页查询)和SpringData 方法...](https://blog.csdn.net/weixin_53472653/article/details/122887200)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [mongodb多条件分页查询的三种方法](https://blog.csdn.net/weixin_43935907/article/details/91354738)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值