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

1 篇文章 0 订阅
1 篇文章 0 订阅

当查找包含在某个集合范围使用关键字的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方法。


  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值