您的位置:首页 > 数据库 > Mongodb

spring mongodb 查询封装

2015-07-31 14:47 387 查看

通过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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: