mongodb many conditions paging query

Zuoren articles are taught - I do not know the wording

@Autowired
private MongoTemplate mongoTemplate;

@Autowired
private MongoPageHandler mongoPageHandler;

public List<Map> handler(QueryDataByConditionsCommand command) throws EasywareException {
        Criteria criteria = new Criteria();
        Validate.execAssert(command.getInstanceItems()!=null,"请设置默认查询条件");
        mongoPageHandler.jointParams(command.getInstanceItems(),criteria);
        Pageable pageable = new PageRequest(command.getOffset(), command.getLimit());
        List<Map> results = mongoTemplate.find(new Query().addCriteria(criteria).with(pageable).with(new Sort(Direction.ASC, "date")),Map.class, command.getEntityName());
        return results;
}

 

MongoPageHandler:

import com.easyware.comman.controller.PagedQueryResult;
import com.easyware.comman.domain.AuditEntity;
import com.google.common.collect.Lists;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.domain.Sort.Order;
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.Component;

@Component
public class MongoPageHandler {
    public static final int FIRST_PAGE_NUM = 1;
    public static final String ID = "_id";
    public static final String CREATE_TIME = "createTime";
    private final MongoTemplate mongoTemplate;

    @Autowired
    public MongoPageHandler(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }

    public <T extends AuditEntity> PagedQueryResult<T> pageQuery(Map<String, Object> paramsMap, Class<T> entityClass, Integer pageSize, Integer pageNum, String lastId, boolean isNextPage) {
        Query query = new Query();
        Criteria criteria = new Criteria();
        this.jointParams(paramsMap, criteria);
        query.addCriteria(criteria);
        long total = this.mongoTemplate.count(query, entityClass);
        Integer pages = (int)Math.ceil((double)total / (double)pageSize);
        if (pageNum <= 0 || pageNum > pages) {
            pageNum = 1;
        }

        if (pageNum != 1) {
            if (isNextPage) {
                criteria.and("_id").gt(UUID.fromString(lastId));
            } else {
                criteria.and("_id").lt(UUID.fromString(lastId));
            }
        }

        query.limit(pageSize);
        query.addCriteria(criteria);
        List<T> entityList = this.mongoTemplate.find(query, entityClass);
        PagedQueryResult<T> pagedQueryResult = new PagedQueryResult();
        pagedQueryResult.setTotal((int)total);
        pagedQueryResult.setList(entityList);
        return pagedQueryResult;
    }

    public <T extends AuditEntity> PagedQueryResult<T> pageQuery(Map<String, Object> paramsMap, Class<T> entityClass, Integer limit, Integer offset, Sort sort, String collectionName) {
        Query query = new Query();
        Criteria criteria = new Criteria();
        this.jointParams(paramsMap, criteria);
        query.addCriteria(criteria);
        long total = collectionName == null ? this.mongoTemplate.count(query, entityClass) : this.mongoTemplate.count(query, entityClass, collectionName);
        Integer pages = (int)Math.ceil((double)total / (double)limit);
        PagedQueryResult<T> pagedQueryResult = new PagedQueryResult();
        pagedQueryResult.setTotal((int)total);
        if (offset <= 0) {
            offset = 1;
        } else if (offset > pages) {
            return pagedQueryResult;
        }

        if (null != sort) {
            query.with(sort);
        } else {
            query.with(Sort.by(Lists.newArrayList(new Order[]{new Order(Direction.DESC, "createTime")})));
        }

        int skip = limit * (offset - 1);
        query.skip((long)skip).limit(limit);
        List<T> entityList = collectionName == null ? this.mongoTemplate.find(query, entityClass) : this.mongoTemplate.find(query, entityClass, collectionName);
        pagedQueryResult.setList(entityList);
        return pagedQueryResult;
    }

    public void jointParams(Map<String, Object> paramsMap, Criteria criteria) {
        Map<String, MongoPageHandler.ScopeParams> map = new HashMap();
        Iterator var4 = paramsMap.keySet().iterator();

        while(var4.hasNext()) {
            String col = (String)var4.next();
            String str;
            Object obj;
            MongoPageHandler.ScopeParams scopeParams;
            if (col.contains("From")) {
                str = col.replace("From", "");
                obj = paramsMap.get(col);
                scopeParams = (MongoPageHandler.ScopeParams)map.get(str);
                if (scopeParams == null) {
                    scopeParams = new MongoPageHandler.ScopeParams();
                    scopeParams.name = str;
                    map.put(str, scopeParams);
                }

                scopeParams.gteValue = obj;
            } else if (col.contains("To")) {
                str = col.replace("To", "");
                obj = paramsMap.get(col);
                scopeParams = (MongoPageHandler.ScopeParams)map.get(str);
                if (scopeParams == null) {
                    scopeParams = new MongoPageHandler.ScopeParams();
                    scopeParams.name = str;
                    map.put(str, scopeParams);
                }

                scopeParams.lteValue = obj;
            } else if (paramsMap.get(col) instanceof String) {
                str = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$";
                if (((String)paramsMap.get(col)).matches("^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$")) {
                    criteria.and(col).is(UUID.fromString(paramsMap.get(col).toString()));
                    System.out.println(UUID.fromString(paramsMap.get(col).toString()));
                } else {
                    criteria.and(col).regex(".*?" + paramsMap.get(col) + ".*", "i");
                }
            } else {
                criteria.and(col).is(paramsMap.get(col));
            }
        }

        var4 = map.values().iterator();

        while(true) {
            while(var4.hasNext()) {
                MongoPageHandler.ScopeParams sp = (MongoPageHandler.ScopeParams)var4.next();
                if (sp.gteValue != null && sp.lteValue != null) {
                    criteria.and(sp.name).gte(sp.gteValue).lte(sp.lteValue);
                } else if (sp.gteValue != null) {
                    criteria.and(sp.name).gte(sp.gteValue);
                } else {
                    criteria.and(sp.name).lte(sp.lteValue);
                }
            }

            return;
        }
    }

    public class ScopeParams {
        public String name;
        public Object gteValue;
        public Object lteValue;

        public ScopeParams() {
        }
    }
}

  

Guess you like

Origin www.cnblogs.com/mxh-java/p/11590367.html