上述代码中 where.andOperator(Criteria.where(entry.getKey()).is(entry.getValue())); 执行报错
时间: 2024-02-01 18:16:49 浏览: 104
如果报错信息是 `java.lang.IllegalArgumentException: Invalid reference '$and'!`,那么可能是因为你在构建 `Criteria` 对象时,使用了 `$and` 字段作为查询条件的一部分。这是不允许的,因为 `$and` 是 MongoDB 中的逻辑运算符,用于将多个查询条件组合在一起。
如果你想使用 `and` 条件来组合多个查询条件,可以使用以下代码:
```
Criteria criteria = new Criteria();
for (Map.Entry<String, Object> entry : queryParams.entrySet()) {
criteria.and(entry.getKey()).is(entry.getValue());
}
Query query = new Query(criteria);
```
这样就可以避免使用 `$and` 字段,而是直接使用 `and` 条件来组合多个查询条件。
相关问题
public List<T> findAllByPage(Class<T> tClass, Date startTime, Date endTime, int page, int size, Map<String, String> searchMap) { Criteria where = new Criteria(); if (startTime != null && endTime != null) { where.andOperator(Criteria.where("clickTime").gte(startTime), Criteria.where("clickTime").lte(endTime)); } for (Map.Entry<String, String> entry : searchMap.entrySet()) { where.and("\"" + entry.getKey() + "\"").is(entry.getValue()); } Query query = new Query(where); query.skip((page - 1) * size).limit(size); return mongoTemplate.find(query, tClass); } } 上述代码中 where.and 后面的查询字段 是map中的key值 代码应该怎么改
可以将 `where.and("\"" + entry.getKey() + "\"").is(entry.getValue())` 改为 `where.and(entry.getKey()).is(entry.getValue()))` ,这样就可以直接使用 map 中的 key 作为查询字段了。修改后的代码如下:
```
public List<T> findAllByPage(Class<T> tClass, Date startTime, Date endTime, int page, int size, Map<String, String> searchMap) {
Criteria where = new Criteria();
if (startTime != null && endTime != null) {
where.andOperator(Criteria.where("clickTime").gte(startTime), Criteria.where("clickTime").lte(endTime));
}
for (Map.Entry<String, String> entry : searchMap.entrySet()) {
where.and(entry.getKey()).is(entry.getValue());
}
Query query = new Query(where);
query.skip((page - 1) * size).limit(size);
return mongoTemplate.find(query, tClass);
}
```
public List<T> findAllByPage(Class<T> tClass, Date startTime, Date endTime, int page, int size, Map<String, String> searchMap){ Criteria where = new Criteria(); if (startTime != null && endTime != null){ where.andOperator(Criteria.where("clickTime").gte(startTime),Criteria.where("clickTime").lte(endTime)); } for (Map.Entry<String, String> entry : searchMap.entrySet()) { where.andOperator(Criteria.where("\""+ entry.getKey() +"\"").gte(entry.getValue())); } Query query = new Query(where); query.skip((page - 1) * size).limit(size); return mongoTemplate.find(query,tClass); } 上述代码问题在哪里?
上述代码的问题在于以下几点:
1. 在使用 Criteria 的 andOperator 方法拼接条件时,如果 searchMap 中有多个条件,应该使用 Criteria 的多个 and 方法拼接条件,而不是多次调用 andOperator 方法。
2. 在使用 Criteria 拼接条件时,如果需要使用双引号包含字段名,应该使用 Criteria.where 方法的第一个参数来指定字段名,而不是直接在字符串中添加双引号。
3. 在使用 Criteria 拼接条件时,如果需要使用大于等于或小于等于的比较符号,应该使用 Criteria 的 gte 和 lte 方法,而不是使用大于号和小于号。
4. 在调用 mongoTemplate.find 方法时,应该将 tClass 作为第一个参数传入。
下面是修改后的代码:
```
public List<T> findAllByPage(Class<T> tClass, Date startTime, Date endTime, int page, int size, Map<String, String> searchMap) {
Criteria where = new Criteria();
if (startTime != null && endTime != null) {
where.andOperator(Criteria.where("clickTime").gte(startTime), Criteria.where("clickTime").lte(endTime));
}
for (Map.Entry<String, String> entry : searchMap.entrySet()) {
where.and(Criteria.where(entry.getKey()).gte(entry.getValue()));
}
Query query = new Query(where);
query.skip((page - 1) * size).limit(size);
return mongoTemplate.find(query, tClass);
}
```
阅读全文