Mongotemplate多种情景模糊查询

Criteria类:它封装所有的语句,以方法的形式进行查询。

Query类:这是将语句进行封装或者添加排序之类的操作。

按照姓名精确查询

Query query = new Query();
query.addCriteria(Criteria.where("name").is(name));
按照姓名模糊查询

Pattern pattern=Pattern.compile("^.*"+pattern_name+".*$", Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("name").regex(pattern));
多条件查询

Query query = new Query();
query.addCriteria(Criteria.where("name").is(name));
query.addCriteria(Criteria.where("age").is(age));
或者另外一种写法

Criteria criteria = new Criteria();
criteria.and("name").is(name);
criteria.and("_id").is(new ObjectId(id));
Query query = new Query(criteria);
一个模糊关键字匹配多字段 

Pattern pattern=Pattern.compile("^.*"+pattern_name+".*$", Pattern.CASE_INSENSITIVE);
            criatira.orOperator(Criteria.where("name").regex(pattern),
                    Criteria.where("sex").regex(pattern),
                    Criteria.where("age").regex(pattern),
                    Criteria.where("class").regex(pattern));

/**
* 这里使用的正则表达式的方式
* 第二个参数Pattern.CASE_INSENSITIVE是对字符大小写不明感匹配
*/
Pattern pattern = Pattern.compile("^.*"+这里拼接你的查询条件字符串+".*$", Pattern.CASE_INSENSITIVE);
/**
* criteria.and().regex() 在这里是构建了一个模糊查询的条件,并且用 'and/or' 相连
* query.addCriteria 把条件封装起来
*/
query.addCriteria(criteria.and("这里填写你MongoDB集合中的key").regex(pattern));

在某个值之间的条件(类似于sql中的BETWEEN ... AND)
如果在这里,模仿精准查询,把 is() 方法换成 gt() 或 lt() ,然后运行,肯定会报错,具体的
错误信息我没有记录下来,大概意思就是同一个字段连续出现了两次
这里需要用到 andOperator 方法,如下
//大于方法
Criteria gt = Criteria.where("你MongoDB中的key").gt("你的条件");
//小于方法
Criteria lt = Criteria.where("你MongoDB中的key").lt("你的条件");
/**
  * new Criteria().andOperator(gt,lt) 把上面的大于和小于放在一起,注意上面两个key一定是一样的
  * andOperator() 这个方法就是关键的方法了,把同key的多个条件组在一起
  * 但是 andOperator() 有个很坑的地方就是,在一个query中只能出现一次
  * 如果你有很固定很明确的入参,那还好,直接调用一次 andOperator()
  * 如果是多个key需要多个条件,而且条件数量还是动态的,怕不是魔鬼吧...
  */
query.addCriteria(new Criteria().andOperator(gt,lt));

还可以这样写

//条件查询2,gte大于 lte小于

Criteria criteria1 = Criteria.where("timestamp").gte(startTime).lte(endTime+1000);

一个query中只能存在一个 andOperator() 方法的时候,就应该把思考方向放在如何
把不确定个数的 Criteria 对象放入一个 andOperator() 方法中,这里是把多个 Criteria 对象用
逗号分隔的,其实 andOperator() 方法还可以入参 Criteria[] 数组
定义数组的话,那么问题又来了,如何确定数组的长度...即使定义了一个 [1024] 这样长度的数组
那如果逻辑中还有 if 判断隔开了,那数组的下标如何保证连续不错误,于是就又定义了一个List<Criteria>
泛型集合,先往集合里面存,完事了后就把集合遍历放入数组,最后把数组入参到 andOperator() 方法
//定义一个泛型集合,类型为 Criteria
List<Criteria> criteriaList = new ArrayList<>();
//定义一个无长度的数组,类型为 Criteria
Criteria[] criteriaArray = {};
//往集合里面添加条件对象
if(你的逻辑){
    //大于方法
    Criteria gt = Criteria.where("你MongoDB中的key").gt("你的条件");
    //小于方法
    Criteria lt = Criteria.where("你MongoDB中的key").lt("你的条件");
    if(gt!=null && lt!=null){
        criteriaList.add(gt);
        criteriaList.add(lt);
    }else if(gt!=null){
        query.addCriteria(gt);
    }else if(lt!=null){
        query.addCriteria(lt);
    }
}
//是否有条件
if(criteriaList.size()>0){
    //把无长度的数组实例出来,长度就位集合的个数
    criteriaArray = new Criteria[criteriaList.size()];
    for(int i = 0 ; i < criteriaList.size() ; i++){
        //把集合中的条件对象全部存入数组中
        criteriaArray[i] = criteriaList.get(i);
    }
}
//最后把数组入参到 andOperator() 方法中
query.addCriteria(new Criteria().andOperator(criteriaArray));

https://blog.csdn.net/qq_41402200/article/details/82149110?utm_source=copy 

原文:https://blog.csdn.net/weixin_42227975/article/details/80533678

猜你喜欢

转载自blog.csdn.net/qq_31868149/article/details/82908628
今日推荐