java MongoDB 列表分页查询

69 篇文章 1 订阅
2 篇文章 0 订阅

Java MongoDB分页查询

查询工具类

package com.bx.utils;

import com.google.common.collect.Lists;
import com.java.framework.model.WebViewModel;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.regex.Pattern;

import static org.springframework.data.mongodb.core.query.Criteria.where;

/**
 * @author: buwt
 * @date: 2023/02/01
 * @time: 12:45
 */
public class MongodbCriteriaUtils {

    public static void setQuery(Query query, WebViewModel model) {
        WebViewModel.Relation relation = model.getRelationsCondition();
        if (relation == null) {
            List<WebViewModel.Condition> conditions = model.getCondition();
            if (conditions == null || conditions.isEmpty()) {
                return;
            }
            relation = new WebViewModel.Relation();
            relation.setRelationType("AND");
            relation.setConditions(conditions);
        }
        List<Criteria> criteriaList = getCriteria(relation);
        if (criteriaList.isEmpty()) {
            return;
        }
        query.addCriteria(operator(relation.getRelationType(), criteriaList));
    }

    public static Pageable pageable(WebViewModel viewModel) {
        WebViewModel.Page page = viewModel.getPage();
        int currPage = page.getCurrPage();
        int pageSize = page.getPageSize();
        if (pageSize < 1) {
            pageSize = 10;
        }
        List<WebViewModel.Order> orders = viewModel.getOrder();
        if (orders != null && orders.size() > 0) {
            List<Sort.Order> orderList = Lists.newArrayList();
            for (WebViewModel.Order order : orders) {
                try {
                    if (StringUtils.isBlank(order.getColName())) {
                        continue;
                    }
                    Sort.Order ord;
                    if (StringUtils.isBlank(order.getOrderType())) {
                        ord = new Sort.Order(Sort.Direction.ASC, order.getColName());
                    } else {
                        ord = new Sort.Order(Sort.Direction.fromString(order.getOrderType()), order.getColName());
                    }
                    orderList.add(ord);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (!orders.isEmpty()) {
                Sort sort = new Sort(orderList);
                return new PageRequest(Math.max(currPage - 1, 0), pageSize, sort);
            }
        }
        return new PageRequest(Math.max(currPage - 1, 0), pageSize);
    }


    private static List<Criteria> getCriteria(WebViewModel.Relation relation) {
        List<Criteria> criteriaList = new ArrayList<>();
        List<WebViewModel.Condition> conditions = relation.getConditions();
        List<WebViewModel.Relation> relations = relation.getRelations();
        if (isNotEmpty(conditions)) {
            for (WebViewModel.Condition condition : conditions) {
                if (StringUtils.isBlank(condition.getColName())) {
                    continue;
                }
                Criteria criteria = getCriteria(condition.getColName(), condition.getRuleType(), condition.getValue());
                if (criteria == null) {
                    continue;
                }
                criteriaList.add(criteria);
            }
        }
        if (isNotEmpty(relations)) {
            for (WebViewModel.Relation relation1 : relations) {
                List<Criteria> critters = getCriteria(relation1);
                if (isNotEmpty(critters)) {
                    Criteria criteria = operator(relation1.getRelationType(), critters);
                    criteriaList.add(criteria);
                }
            }
        }
        return criteriaList;
    }

    private static boolean isEmpty(Collection<?> collection) {
        return collection == null || collection.isEmpty();
    }

    private static boolean isNotEmpty(Collection<?> collection) {
        return !isEmpty(collection);
    }

    private static Criteria getCriteria(String colName, String ruleType, Object value) {
        if (StringUtils.isBlank(ruleType)) {
            ruleType = "EQ";
        }
        switch (ruleType.toUpperCase()) {
            case "NE":
                return where(colName).ne(value);
            case "LIKE":
                return where(colName).regex(Pattern.compile("^.*" + value + ".*$"));
            case "IN": {
                if (value == null || StringUtils.isBlank(value.toString())) {
                    return null;
                }
                ArrayList<String> arrayList = Lists.newArrayList(value.toString().split(","));
                return where(colName).in(arrayList);
            }
            case "NIN": {
                if (value == null || StringUtils.isBlank(value.toString())) {
                    return null;
                }
                ArrayList<String> arrayList = Lists.newArrayList(value.toString().split(","));
                return where(colName).nin(arrayList);
            }
            case "GE":
                return where(colName).gte(value);
            case "LE":
                return where(colName).lte(value);
            case "GT":
                return where(colName).gt(value);
            case "LT":
                return where(colName).lt(value);
            case "EQ":
            default:
                return where(colName).is(value);
        }
    }

    private static Criteria operator(String ruleType, List<Criteria> criteriaList) {
        Criteria criteria = new Criteria();
        switch (ruleType.toUpperCase()) {
            case "OR":
                criteria.orOperator(criteriaList.toArray(new Criteria[0]));
                break;
            case "AND":
            default:
                criteria.andOperator(criteriaList.toArray(new Criteria[0]));
                break;
        }
        return criteria;
    }
}

WebViewModel 对象(列表接口请求对象)

package com.java.framework.model;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

import java.io.Serializable;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel(value = "查询数据请求对象", description = "前端的数据查询接口请求数据封装到这个对象")
public class WebViewModel implements Serializable {

	 /**
	 *
	 */
	private static final long serialVersionUID = 1L;

	// 查询条件
	private List<Condition> condition;
	
	//关系条件
	private Relation relationsCondition;

	//组
//	private List<Map<String,Object>> group;

	// 排序
	private List<Order>  order;

	// 分页
	private Page page;

	public List<Condition> getCondition() {
		return condition;
	}

	public void setCondition(List<Condition> condition) {
		this.condition = condition;
	}

	public List<Order> getOrder() {
		return order;
	}

	public void setOrder(List<Order> order) {
		this.order = order;
	}

	public Page getPage() {
		return page;
	}

	public void setPage(Page page) {
		this.page = page;
	}

	public Relation getRelationsCondition() {
		return relationsCondition;
	}

	public void setRelationsCondition(Relation relationsCondition) {
		this.relationsCondition = relationsCondition;
	}

	// 条件
//	@ApiModel(value = "查询条件", description = "查询条件组装对象")
	public static class Condition implements Serializable{
		@ApiModelProperty(value = "属性名(property)")
		private String colName;
		@ApiModelProperty(value = "匹配规则", allowableValues = "EQ, NE, LIKE, GT, LT, GE, LE, IN, NIN")
		private String ruleType;
		@ApiModelProperty(value = "属性值")
		private Object value;
		public Condition() {
			// TODO Auto-generated constructor stub
		}
		public String getColName() {
			return colName;
		}
		public void setColName(String colName) {
			this.colName = colName;
		}
		public String getRuleType() {
			return ruleType;
		}
		public void setRuleType(String ruleType) {
			this.ruleType = ruleType;
		}
		public Object getValue() {
			return value;
		}
		public void setValue(Object value) {
			this.value = value;
		}
		@Override
		public String toString() {
			return "Condition {colName=" + colName + ", ruleType=" + ruleType + ", value=" + value + "}";
		}
	}

	public static class Relation implements Serializable {
		@ApiModelProperty(value = "条件关系符(默认AND)", allowableValues = "AND,OR")
		private String relationType = "AND";
		private List<Condition> conditions = new ArrayList<>();
		private List<Relation> relations = new ArrayList<>();
		public Relation(){}

		public String getRelationType() {
			return relationType;
		}

		public void setRelationType(String relationType) {
			this.relationType = relationType;
		}

		public List<Condition> getConditions() {
			return conditions;
		}

		public void setConditions(List<Condition> conditions) {
			this.conditions = conditions;
		}

		public void addCondition(Condition condition) {
			this.conditions.add(condition);
		}

		public void removeCondition(Condition condition) {
			this.conditions.remove(condition);
		}

		public List<Relation> getRelations() {
			return relations;
		}

		public void setRelations(List<Relation> relations) {
			this.relations = relations;
		}

		@Override
		public String toString() {
			return "Relation{" +
					"relationType='" + relationType + '\'' +
					", conditions=" + conditions +
					", relations=" + relations +
					'}';
		}
	}

//	@ApiModel(value = "排序对象", description = "排序方式组装对象")
	public static class Order implements Serializable {
		@ApiModelProperty(value = "属性名(property)")
		private String colName;
		@ApiModelProperty(value = "排序类型", allowableValues = "asc,desc")
		private String orderType;
		public String getColName() {
			return colName;
		}
		public void setColName(String colName) {
			this.colName = colName;
		}
		public String getOrderType() {
			return orderType;
		}
		public void setOrderType(String orderType) {
			this.orderType = orderType;
		}
		@Override
		public String toString() {
			return "Order [colName=" + colName + ", orderType=" + orderType + "]";
		}
	}

	@ApiModel(value = "分页对象", description = "分页数据组装对象")
	public static class Page implements Serializable {
		@ApiModelProperty(value = "当前页码", dataType = "int", required = true)
		private int currPage;
		@ApiModelProperty(value = "每页条数", dataType = "int", required = true)
		private int pageSize;

		public int getCurrPage() {
				return currPage;
			}

		public void setCurrPage(int currPage) {
			this.currPage = currPage;
		}

		public int getPageSize() {
			return pageSize;
		}

		public void setPageSize(int pageSize) {
			this.pageSize = pageSize;
		}

		@Override
		public String toString() {
			return "Page [currPage=" + currPage + ", pageSize=" + pageSize + "]";
		}
	}
}

代码示例

    @PostMapping("taskDoListTwo")
    @ApiOperation("我的已办")
    public DataModel<ProcessHandleHistory> taskDoListTwo(@RequestBody WebViewModel model) throws Exception {
        Pageable pageable = MongodbCriteriaUtils.pageable(model);
        Query query = new Query();
        MongodbCriteriaUtils.setQuery(query, model);
        List<ProcessHandleHistory> handleHistories =
                mongoTemplate.find(query.with(pageable), ProcessHandleHistory.class, "process_handle_history");
        long count = mongoTemplate.count(query, ProcessHandleHistory.class, "process_handle_history");
        return SupplierHelper.create(DataModel.Builder<ProcessHandleHistory>::new)
                .setDatas(handleHistories)
                .setTotal(count)
                .setPageSize(pageable.getPageSize())
                .setCurrPage(pageable.getPageNumber()+1)
                .setTotalPages((int) (count / pageable.getPageSize()))
                .build();
    }

查询示例

{
	"page": {
		"currPage": 0,
		"pageSize": 10
	},
	"condition": [
		{
			"colName": "owner",
			"ruleType": "EQ",
			"value": "5d5a3cebcfb7e91344537723"
		},
		{
			"colName": "commentType",
			"ruleType": "NE",
			"value": "发起申请"
		},
		{
			"colName": "applyUser.bussTitle",
			"ruleType": "LIKE",
			"value": "测试"
		}
	],
	"order": [
		{
			"colName": "startTime",
			"orderType": "desc"
		}
	]
}

响应示例

{
	"flag": true,
	"shortMessage": null,
	"message": null,
	"condition": null,
	"datas": [
		{
			"applyUser": {
				"applyUser": "吴婷婷",
				"bussTitle": "测试27",
				"bussId": "60adece23bc08a6180fd966c"
			},
			"owner": "5d5a3cebcfb7e91344537723"
		},
		{
			"applyUser": {
				"applyUser": "administ",
				"bussTitle": "新流程测试",
				"bussId": "5efef4fbe42b5a09cd7f3205"
			}
			"owner": "5d5a3cebcfb7e91344537723"
		}
	],
	"data": null,
	"page": {
		"currPage": 1,
		"pageSize": 10,
		"total": 53,
		"totalPages": 5
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值