由于springboot mongo自带的分页只能使用Example方式,但是Example方式用不好,局限性大,习惯使用mongoTemplate方式
本工具调用springboot mongo自带的分页
MongoPageUtil
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.repository.support.PageableExecutionUtils;
import java.util.List;
/**
* @author liaozesong
*/
public class MongoPageUtil {
/**
* 分页查询封装
*
* @param query 查询条件
* @param pageable 分页参数
* @param clazz 表对象
* @param mongoTemplate mongo处理模板
* @return 查询分页后数据
*/
public static <T> Page<T> findPage(Query query, Pageable pageable, Class<T> clazz, MongoTemplate mongoTemplate) {
query.with(pageable);
List<T> list = mongoTemplate.find(query, clazz);
return PageableExecutionUtils.getPage(list, pageable,
() -> mongoTemplate.count(Query.of(query).limit(-1).skip(-1), clazz));
}
/**
* 聚合分页查询封装
*
* @param operations 聚合条件
* @param pageable 分页参数
* @param clazz 表对象
* @param mongoTemplate mongo处理模板
* @return 查询分页后数据
*/
public static <T> Page<T> findPage(List<AggregationOperation> operations, Pageable pageable, Class<T> clazz, MongoTemplate mongoTemplate) {
SkipOperation skip = Aggregation.skip(pageable.getOffset());
LimitOperation limit = Aggregation.limit(pageable.getPageSize());
CountOperation total = Aggregation.count().as("total");
operations.add(skip);
operations.add(limit);
List<T> list = mongoTemplate.aggregate(Aggregation.newAggregation(operations), clazz, clazz).getMappedResults();
return PageableExecutionUtils.getPage(list, pageable, () -> {
operations.remove(skip);
operations.remove(limit);
operations.add(total);
HashMap<String, Long> map = mongoTemplate.aggregate(Aggregation.newAggregation(operations), clazz, HashMap.class).getMappedResults().get(0);
return map.get("total");
});
}
}
调用方
public Page<DataTrack> selectPage(TrackParam param) {
String beginDate = param.getBeginDate();
String endDate = param.getEndDate();
String lineId = param.getLineId();
Criteria criteria = Criteria
.where("lid").is(lineId)
.and("startTimestamp")
.gte(DateUtil.parse(beginDate).getTime())
.lte(DateUtil.parse(endDate).getTime());
Query query = Query.query(criteria);
return MongoPageUtil.findPage(query, param.genPageable(), DataTrack.class, mongoTemplate);
}
page入参
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
/**
* 分页参数
*
* @author liaozesong
*/
@Data
public class PageParam {
@ApiModelProperty(value = "页码", required = true, example = "1")
private Integer pageNo;
@ApiModelProperty(value = "每页条数", required = true, example = "5")
private Integer pageSize;
public Pageable genPageable() {
return PageRequest.of(getPageNo() - 1, getPageSize());
}
}