记spring data mongodb使用Criteria 的一个小坑

当查找包含在某个集合范围使用关键字的in的时候,查看api如下参数是要一个集合

public Criteria in(Collection c) {
    this.criteria.put("$in", c);
    return this;
}

但是现实情况往往是数组会方便很多,于是就抱着试试的态度发现使用数组编译也不会报错

public List listByUserIds(long[] userId) {
    Criteria criteria =new Criteria("userId").in(userId);
    Query query = Query.query(criteria);
    List list = find(query);
    return list;
}

但是却一直找不到数据,看其原因发现是springmongdb在转化的时候比mongodb的语法多了一个中括号,如下


于是我只能把数组转化成集合如下 发现成功了。


那为什么用数组没报错但是却转化错误呢,原因在于Criteria 有两个IN方法还有一个如下

public Criteria in(Object... o) {
    if (o.length > 1 && o[1] instanceof Collection) {
        throw new InvalidMongoDbApiUsageException("You can only pass in one argument of type " + o[1].getClass().getName());
    } else {
        this.criteria.put("$in", Arrays.asList(o));
        return this;
    }
}
这个方法是可以接受多个Object参数的,所以你in里面放入任何参数都是不会报错的,并且他会把他们封装成一个数组,所以当你填入一个数组的时候,就会被转化成一个二维数组了,所以这里面是不能放数组的。

总结:Criteria in里面可以放集合,不能放数组,或者把数组里面的值单独提出来类似第二个API方法。


你可能感兴趣的:(springdata,mongodb,小记,spring,data,mongodb,Criteria)