实体类:
package cn.yiducloud.project.task.model;
import lombok.Data;
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import org.springframework.data.mongodb.core.mapping.MongoId;
import java.io.Serializable;
import java.util.Date;
@Data
@Document(collection = "task")
public class Task implements Serializable {
//MongoDb的主键类型设置为ObjectId类型,并且加@MongoId注解,不然直接通过主键查询的时候会返回null
@MongoId
@Field("_id")
private ObjectId id;
@Field("type")
private String type;
@Field("status")
private String status;
@Field("param")
private String param;
@Field("url")
private String url;
@Field("create_time")
private Date createTime;
@Field("update_time")
private Date updateTime;
}
查询逻辑见代码里,有相关注释:
package cn.yiducloud.project.task.service.impl;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.yiducloud.project.task.dataroute.TaskDao;
import cn.yiducloud.project.task.dto.TaskQueryDto;
import cn.yiducloud.project.task.model.Task;
import cn.yiducloud.project.task.service.TaskService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class TaskServiceImpl implements TaskService {
@Resource
private TaskDao taskDao;
@Override
public Page<Task> pageList(TaskQueryDto taskQueryDto) {
//获取MongoTemplate,这里有很多方法,可以自选
MongoTemplate template = taskDao.getTemplate();
//创建查询对象
Query query = new Query();
//获取页码参数
Integer pageNum = taskQueryDto.getPageNum();
Integer pageSize = taskQueryDto.getPageSize();
if (StrUtil.isNotBlank(taskQueryDto.getType())) {
query.addCriteria(Criteria.where("type").is(taskQueryDto.getType()));
}
if (StrUtil.isNotBlank(taskQueryDto.getStatus())) {
query.addCriteria(Criteria.where("status").is(taskQueryDto.getStatus()));
}
//拆解起止时间的数组
if (StrUtil.isNotBlank(taskQueryDto.getStartDate())||StrUtil.isNotBlank(taskQueryDto.getEndDate())) {
//要查询同一个字段多个约束需要用andOperator:不然会报异常:you can't add a second 'createtime' expression specified as 'createtime
//先创建create_time的Criteria,然后灵活加时间起止判定条件
Criteria create_time = Criteria.where("create_time");
if (StrUtil.isNotBlank(taskQueryDto.getStartDate())) {
create_time.gte(DateUtil.parse(taskQueryDto.getStartDate()+" 00:00:00"
, DatePattern.NORM_DATETIME_FORMAT));
}
if (StrUtil.isNotBlank(taskQueryDto.getEndDate())) {
create_time.lte(DateUtil.parse(taskQueryDto.getEndDate()+" 23:59:59"
, DatePattern.NORM_DATETIME_FORMAT));
}
query.addCriteria(create_time);
}
//查询总记录数
int count = (int) template.count(query, Task.class);
//按照创建时间倒序
query.with(Sort.by(Sort.Order.desc("create_time")));
//设置起始数
query.skip((pageNum - 1) * pageSize);
//设置查询条数
query.limit(pageSize);
//查询当前页数据集合
List<Task> taskList = template.find(query, Task.class);
//创建分页实体对象
Page<Task> page = new Page<>();
//添加每页的集合、数据总条数、总页数
page.setRecords(taskList);
page.setTotal(count);
page.setSize(count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
return page;
}
}