spring mongodb 查询封装

通过mongodb的query查询

直接mongoTemple直接调用即可

public List<T> findByQuery(String query){
        BasicQuery basicQuery  = new BasicQuery(query);
        return mongoTemplate.find(basicQuery, entityClass);
    }

通过Criteria的调用

multiArgs中包含调用方法的参数是Collection对象,需要进行特殊处理,否则反射的时候会找不到方法。

private static String[] multiArgs = new String[]{"nin","in","all"};

通过反射得到Criteria,然后通过mongoTemple再调用query.

Map<String,Map<String,Object>> qMap

第一个Map中的key,是进行查询时候的方法。eg:lt,gt..

第二个Map中key,value。分别是实体的属性和查询的值

   public Criteria createCriteria(Map<String,Map<String,Object>> qMap) {

        Criteria c = new Criteria();
        List<Criteria> listC= new ArrayList<Criteria>();

        for(String op : qMap.keySet()){
            Map<String,?> rmap = qMap.get(op);
            for (String _s : rmap.keySet()) {
                Criteria criteria = Criteria.where(_s);
                Class[] argType = new Class[]{Object.class};
                Object[] args = new Object[]{rmap.get(_s)};

                if(ArrayUtils.contains(multiArgs,_s)){
                    argType = new Class[]{List.class};
                }
                if(StringUtils.equals(_s, "exists")){
                    argType = new Class[]{Boolean.class};
                }
                if(StringUtils.equals(_s, "type") || StringUtils.equals(_s, "size")) {
                    argType = new Class[]{Integer.class};
                }

                criteria = (Criteria) Reflections.invokeMethod(criteria,op,argType,args);
                listC.add(criteria);
            }
        }
        if(listC.size() > 0){
            Criteria [] cs = new Criteria[listC.size()];
            c.andOperator(listC.toArray(cs));
        }
        return c;
    }

调用createCriteria

 public Pager findPagerByMap(Pager pager , Map<String,Map<String,Object>> smap){
        Criteria criteria = createCriteria(smap);
        Query query = new Query(criteria);
        return findPage(pager,query);
    }

测试用例

public void testQuery(){
        Pager pager = new Pager();
        Map<String,Object> rmap = new HashMap<String,Object>();
        rmap.put("methodName","maintain");
        rmap.put("host","localhost:8080");
        Map<String,Map<String,Object>> smap = Maps.newHashMap();
        smap.put("is",rmap);
        rmap = new HashMap<String, Object>();
        rmap.put("createDate",new Date());
        smap.put("lt",rmap);
        pager = logService.findPagerByMap(pager,smap);
        List<Log> logs = (List<Log>) pager.getList();
    }

** 欢迎加入193826252讨论 实现代码地址https://git.oschina.net/xForMe/fast_redis.git **

转载于:https://my.oschina.net/xForMe/blog/486105

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值