【Spring Data】MongoTemplate 分页、排序、动态条件查询

实体类

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);
    }

}




End


猜你喜欢

转载自blog.csdn.net/weixin_43657300/article/details/128240669