【Spring Data】MongoTemplate 分页、排序、动态条件查询
原创
©著作权归作者所有:来自51CTO博客作者ywb201314的原创作品,请联系作者获取转载授权,否则将追究法律责任
实体类
public class Student implements Serializable {
// id
private String id;
// 姓名
private String name;
// 创建时间
private String createTime;
}
查询、分页、排序实现
import org.springframework.data.domain.*;
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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
@Component
public class OperationLogServiceImpl implements OperationLogService {
@Autowired
private MongoTemplate mongoTemplate;
private static final String LIKE_PREFIX = "^.*";
private static final String LIKE_SUFFIX = ".*$";
/**
* 查询
*
* @param num 第几页
* @param pageSize 每页多少条
* @return
*/
@Override
public PageResult<OperationLogVo> vehicleOperationLogList(int num, int pageSize) {
Query mongoQuery = new Query();
final OperationLogConditionPocondition = po.getCondition();
/*
下面的这些条件去自己需要的即可
*/
// 查询名字叫做 张三 的数据
mongoQuery.addCriteria(Criteria.where("name").is("张三"));
// 模糊查询名字中带有 三 的数据
Pattern pattern = Pattern.compile(LIKE_PREFIX + "三" + LIKE_SUFFIX, Pattern.CASE_INSENSITIVE);
mongoQuery.addCriteria(Criteria.where("name").regex(pattern));
// 下面两个单独查询时间的不能组合使用
// 单独查询创建时间大于 2022-01-01 00:00:00 的数据
mongoQuery.addCriteria(Criteria.where("createTime").gt("2022-01-01 00:00:00"));
// 单独查询创建时间小于 2022-12-31 23:59:59 的数据
mongoQuery.addCriteria(Criteria.where("createTime").lt("2022-12-31 23:59:59"));
// 查询时间范围
Criteria criteria = new Criteria();
criteria.and("date_time").gte("2022-01-01 00:00:00").lte("2022-12-31 23:59:59");
mongoQuery.addCriteria(criteria);
// 查询总条数
final long count = mongoTemplate.count(mongoQuery, PlotOperationLogEntity.class);
// 设置分页和排序
this.setPageableAndSort(mongoQuery, po.getNum(), po.getPageSize());
// 查询【mongoTemplate.find 第一个参数是Query, 第二个参数是你查询的哪张表】
final List<OperationLogVo> list = mongoTemplate.find(mongoQuery, OperationLogVo.class);
PageResult<VehicleOperationLogVo> pageResult = new PageResult<>();
// 查询到的数据数量
pageResult.setCount((long) list.size());
// 总页数
pageResult.setTotal(calcTotalPage(count, po.getPageSize()));
// 查询到的数据列表
pageResult.setList(list);
return pageResult;
}
/**
* 计算总页数
*
* @param totalCount 总条数
* @param pageSize 每页多少条
* @return
*/
private static long calcTotalPage(long totalCount, int pageSize) {
return totalCount % pageSize == 0 ? totalCount / pageSize : totalCount / pageSize + 1;
}
/**
* 分页、排序
*
* @param mongoQuery
* @param num 第几页
* @param pageSize 每页多少条
*/
private void setPageableAndSort(Query mongoQuery, long num, int pageSize){
// 倒序排序
Sort sort = Sort.by(Sort.Direction.DESC, "createTime");
// 分页
Pageable pageable = org.springframework.data.domain.PageRequest.of(Math.toIntExact(num - 1), pageSize);
mongoQuery.with(pageable);
mongoQuery.with(sort);
}
}