MyBatis-Plus中的LambdaQueryWrapper之动态添加不确定个数的or条件
在使用 MyBatis-Plus 的 LambdaQueryWrapper 时,如果对应方法的入参是个数不确定的,比如List<String> bridgeNames
,而且需要对其中的所有变量,使用 or
操作,则写法如下
@GetMapping("/getAlert")
public Result<List<BridgeAlertRecord>> getAlert(
@RequestParam(required = true) List<String> bridgeNames,
@RequestParam(required = false) boolean includeDealt) {
List<BridgeAlertRecord> alerts = null;
LambdaQueryWrapper<BridgeAlertRecord> lqw = new LambdaQueryWrapper<>();
if(!includeDealt) { // 是否过滤掉已处理的预警
lqw.eq(BridgeAlertRecord::getIsDeal, 0); // 这是第一个条件
}
if(bridgeNames == null || bridgeNames.size() <= 0)
return ResultUtil.error("未传递桥梁名称");
// 动态地将所有的 bridgeName 加到 LambdaQueryWrapper 中,以 or 条件连接
lqw.and(wq -> {
for(int i = 0; i < bridgeNames.size(); i++) {
wq.eq(BridgeAlertRecord::getBridgeName, bridgeNames.get(i));
if(i < bridgeNames.size() - 1) // 只要不是最后一个,则追加一个 or 操作符
wq.or();
}
});
log.info("测试,lqw: " + lqw.getTargetSql());
alerts = bridgeAlertRecordService.list(lqw);
return ResultUtil.success(alerts);
}
测试一下:
URL访问:
localhost:8001/acq/alert/getAlert?bridgeNames=白沙沟一号大桥&bridgeNames=岷江二桥
后台打印结果如下:
测试,lqw: (is_deal = ? AND (bridge_name = ? OR bridge_name = ?))
动态拼接 or 语句成功,并且这一块条件在一个 () 中与其他模块的条件一起生效