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
相关产品推荐
相关产品推荐

