spring mongodb 查询封装

原创
2015/07/31 14:47
阅读数 604

通过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 **

展开阅读全文
打赏
0
7 收藏
分享
加载中
更多评论
打赏
0 评论
7 收藏
0
分享
返回顶部
顶部