new Criteria().or
时间: 2024-05-13 16:18:12 浏览: 124
`new Criteria().or` 是 MyBatis 的一种查询条件设置方式,用于构建 OR 条件查询。
使用该方式时,可以使用 `Criteria` 对象的 `or` 方法将多个条件组合起来,形成一个或者多个 OR 条件查询。
例如,以下代码展示了如何使用 `new Criteria().or` 构建 OR 条件查询:
```
Example example = new Example(User.class);
Criteria criteria = example.createCriteria();
criteria.andEqualTo("name", "张三");
criteria.or().andEqualTo("name", "李四");
List<User> userList = userMapper.selectByExample(example);
```
以上代码中,通过 `criteria.or().andEqualTo("name", "李四")` 构建了一个 OR 条件查询,查询条件为姓名等于 "李四"。最终执行 `userMapper.selectByExample(example)` 查询语句,返回满足条件的 `User` 对象集合。
相关问题
Query query = new Query(); query.addCriteria(Criteria.where("delStatus").is(false)); query.addCriteria(Criteria.where("vin").in(vinList)); if (!StringUtils.isEmpty(queryDto.getKeyWord())){ query.addCriteria(new Criteria().orOperator(Criteria.where("plateNo").regex(queryDto.getKeyWord()) ,Criteria.where("vin").regex(queryDto.getKeyWord()))); }这个代码有什么问题 可以怎么修改
这段代码可以改进的地方有:
1. 需要判断 vinList 是否为空,如果为空则不需要添加查询条件。
2. 需要判断 keyWord 是否为空,如果为空则不需要添加模糊查询条件。
3. 如果 keyWord 不为空,建议给正则表达式加上边界符号,如 "^" 和 "$",以避免出现不必要的匹配结果。
下面是修改后的代码:
```
Query query = new Query();
query.addCriteria(Criteria.where("delStatus").is(false));
if (!CollectionUtils.isEmpty(vinList)) {
query.addCriteria(Criteria.where("vin").in(vinList));
}
if (StringUtils.hasText(queryDto.getKeyWord())) {
String keyWord = queryDto.getKeyWord().trim();
Criteria criteria = new Criteria().orOperator(
Criteria.where("plateNo").regex("^" + keyWord + "$", "i"),
Criteria.where("vin").regex("^" + keyWord + "$", "i")
);
query.addCriteria(criteria);
}
```
这样修改后,代码更加严谨和易读。
if (CollectionUtils.isNotEmpty(requestMqInfo.getNameWithIp())) { List<Criteria> criteriaList = new ArrayList<>(); for (MqQueueName mqQueueName : requestMqInfo.getNameWithIp()) { Criteria criteriaToName = Criteria.where("name").is(mqQueueName.getName()) .and("server").is(mqQueueName.getServer()); criteriaList.add(criteriaToName); } Criteria criteriaToAllName = new Criteria().orOperator(criteriaList.toArray(new Criteria[criteriaList.size()])); Criteria criteria = Criteria.where("monitorDate").gte(requestMqInfo.getWatchTimeStart()) .lte(requestMqInfo.getWatchTimeEnd()) .andOperator(criteriaToAllName); } else { Criteria criteria = Criteria.where("monitorDate").gte(requestMqInfo.getWatchTimeStart()) .lte(requestMqInfo.getWatchTimeEnd()); } //按时间升序排序 Sort sort = Sort.by(Sort.Order.asc("monitorDate")); Query query = Query.query(criteria).with(sort); 不好意思刚才忘了
问题出在 `criteria` 变量的作用域。在第一个if语句块中定义的 `criteria` 变量仅在该块中有效,当程序执行到第二个else语句块中时,尝试访问该变量会提示未定义错误。解决方法是将 `criteria` 变量定义在if/else语句块之外,如下所示:
```
Criteria criteria;
if (CollectionUtils.isNotEmpty(requestMqInfo.getNameWithIp())) {
//...
criteria = Criteria.where("monitorDate").gte(requestMqInfo.getWatchTimeStart())
.lte(requestMqInfo.getWatchTimeEnd())
.andOperator(criteriaToAllName);
} else {
criteria = Criteria.where("monitorDate").gte(requestMqInfo.getWatchTimeStart())
.lte(requestMqInfo.getWatchTimeEnd());
}
//按时间升序排序
Sort sort = Sort.by(Sort.Order.asc("monitorDate"));
Query query = Query.query(criteria).with(sort);
```
这样就可以使得 `criteria` 变量在if/else语句块之外也能被访问到。
阅读全文