我是靠谱客的博主 不安楼房,最近开发中收集的这篇文章主要介绍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 分页 SpringDataPageable MongoRepository的全部内容,希望文章能够帮你解决MongoDb 分页 SpringDataPageable MongoRepository所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复