在MyBatis-Plus中,想要实现多个like查询条件之间为or关系,不能直接使用LambdaQueryWrapper的链式调用方法,因为它们之间默认为and关系。因此需要通过自定义SQL片段或者使用apply方法来实现or的逻辑。
如下图:
LambdaQueryWrapper<CabinetModelManagementDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// keyword不为空,模糊查询品牌名称、模型名称、产品型号
String keyword = dto.getKeyword();
if (StringUtil.notEmpty(keyword)) {
// 使用StringBuilder来构建or条件的SQL片段
StringBuilder sb = new StringBuilder();
// 第一个条件不需要前缀or
sb.append("brand_name LIKE CONCAT('%', {0}, '%')");
// 如果需要添加更多条件,则使用or连接
if (Objects.equals(CabinetTypeEnum.SPRING_MACHINE.name(), dto.getCabinetType())) {
sb.append(" OR model_name LIKE CONCAT('%', {0}, '%')");
}
if (Objects.equals(CabinetTypeEnum.OPEN_DOOR_CABINET.name(), dto.getCabinetType())) {
sb.append(" OR product_model LIKE CONCAT('%', {0}, '%')");
}
// 使用apply方法将SQL片段添加到查询中
// 注意:{0}是一个占位符,它会被lambdaQueryWrapper的参数值替换
lambdaQueryWrapper.apply(sb.toString(), keyword);
}
上面的代码中的{0}是一个占位符,它将在apply方法调用时被替换为keyword的值。CONCAT函数用于在关键字前后添加通配符%,以实现模糊查询。
PS:如此拼接方式,是否会存在sql注入攻击的隐患?