如何在Java中使用MongoDB Criteria查询写出更简洁干净的代码?
优化方案
方案1:先收集条件再统一拼接(改造成本最低,无兼容问题)
你之前的写法反复调用andOperator不仅冗余,多次调用该方法在部分旧版本Spring Data MongoDB中还可能出现条件覆盖的问题,最优的基础优化写法是先把所有条件存入列表再统一拼接:
// 初始化条件列表,先放入必填固定条件 List<Criteria> criteriaList = new ArrayList<>(); criteriaList.add(Criteria.where("id").is(id)); criteriaList.add(Criteria.where("name").is(name)); // 可选条件判空后加入列表 if (age != null) { criteriaList.add(Criteria.where("age").is(age)); } if (address != null) { criteriaList.add(Criteria.where("address").is(address)); } if (phoneNum != null) { criteriaList.add(Criteria.where("phonenum").is(phoneNum)); } // 统一用andOperator拼接所有条件 criteria.andOperator(criteriaList.toArray(new Criteria[0]));
后续新增查询条件只需在列表中新增对应判空逻辑即可,代码结构规整易维护。
方案2:封装工具类进一步简化(适合多场景复用)
如果项目中存在大量同类型动态查询需求,可以封装判空加条件的通用工具方法,进一步减少重复代码:
// 工具类方法定义 public static void addCriteriaIfNotNull(List<Criteria> criteriaList, String field, Object value) { if (value != null) { criteriaList.add(Criteria.where(field).is(value)); } } // 业务代码调用 List<Criteria> criteriaList = new ArrayList<>(); // 必填条件直接添加 criteriaList.add(Criteria.where("id").is(id)); criteriaList.add(Criteria.where("name").is(name)); // 可选条件一行完成判空+添加 addCriteriaIfNotNull(criteriaList, "age", age); addCriteriaIfNotNull(criteriaList, "address", address); addCriteriaIfNotNull(criteriaList, "phonenum", phoneNum); criteria.andOperator(criteriaList.toArray(new Criteria[0]));
方案3:使用Example查询(适合纯等值查询场景)
如果你的查询逻辑全是等值匹配,没有范围查询、模糊查询、嵌套查询等复杂逻辑,直接使用Spring Data MongoDB自带的Example查询可以完全省去手动拼接条件的步骤:
// 构造查询实体,把有值的字段赋值即可 User queryParam = new User(); queryParam.setId(id); queryParam.setName(name); if (age != null) queryParam.setAge(age); if (address != null) queryParam.setAddress(address); if (phoneNum != null) queryParam.setPhonenum(phoneNum); // 直接构造查询Example Example<User> example = Example.of(queryParam); // 直接调用mongoTemplate查询即可 List<User> result = mongoTemplate.find(Query.query(Criteria.byExample(example)), User.class);
内容的提问来源于stack exchange,提问作者이재원
相关产品推荐
相关产品推荐

