当查找包含在某个集合范围使用关键字的in的时候,查看api如下参数是要一个集合
public Criteria in(Collection<?> c) { this.criteria.put("$in", c); return this; }
但是现实情况往往是数组会方便很多,于是就抱着试试的态度发现使用数组编译也不会报错
public List<UserOnline> listByUserIds(long[] userId) { Criteria criteria =new Criteria("userId").in(userId); Query query = Query.query(criteria); List<UserOnline> 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方法。