You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data MongoDB中如何判断Criteria对象是否为空?

判断Spring Data MongoDB的Criteria是否为无参构造的空对象

嘿,这个问题我刚好碰到过,给你分享几个可行的方案:

最优雅的方案:利用getCriteriaObject()方法

Spring Data MongoDB的Criteria类提供了getCriteriaObject()公共方法,它会返回当前Criteria对应的查询条件对象(不同版本返回DBObject或Bson)。如果是通过new Criteria()创建的空对象,这个方法返回的对象会是空的,我们可以直接调用isEmpty()来判断:

Criteria emptyCriteria = new Criteria();
boolean isEmpty = emptyCriteria.getCriteriaObject().isEmpty(); // 返回true

// 对比:通过where创建的Criteria,哪怕没加条件也不会为空
Criteria nonEmptyCriteria = Criteria.where("name");
boolean nonEmpty = nonEmptyCriteria.getCriteriaObject().isEmpty(); // 返回false

这个方法的好处是完全依赖公共API,不需要依赖内部实现,兼容性和稳定性都有保障。

不推荐但可行的方案:反射检查内部属性

如果你因为某些特殊情况需要检查内部状态(不建议,因为内部属性可能随版本变化),可以通过反射获取Criteria内部的criteria集合,判断它们是否为空:

import java.lang.reflect.Field;
import java.util.List;

public static boolean isCriteriaEmpty(Criteria criteria) throws NoSuchFieldException, IllegalAccessException {
    Field field = Criteria.class.getDeclaredField("criteria");
    field.setAccessible(true);
    List<?> criteriaList = (List<?>) field.get(criteria);
    return criteriaList.isEmpty();
}

⚠️ 注意:这个方法强依赖Criteria的内部实现,不同版本的Spring Data MongoDB可能会修改内部属性名或结构,所以尽量用第一种方案。

补充说明

  • 只有无参构造的Criteria才会满足getCriteriaObject().isEmpty()返回true;
  • 如果是通过Criteria.where()、Criteria.and()等静态方法创建的实例,哪怕还没添加具体的查询条件,getCriteriaObject()也会包含对应的字段键,不会为空;
  • 当你给空Criteria添加条件后(比如criteria.isNull("age")),getCriteriaObject()就会包含对应的条件,isEmpty()返回false。

内容的提问来源于stack exchange,提问作者italktothewind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:56:46