MyBatis-Plus 多条件 OR 查询使用 nested

发表于 2025-09-19 00:38:21 分类于 默认分类 阅读量 77

MyBatis-Plus 多条件 OR 查询使用 nested

在使用 MyBatis-Plus 查询时,常见需求是 关键字搜索多个字段,例如搜索文章时,需要同时匹配标题和描述字段,只要满足其中一个条件就返回结果。

为了实现这种 OR 查询,可以使用 MyBatis-Plus 提供的 nested 方法,将 OR 条件包裹在括号中,保证优先级正确,同时可以与其他 AND 条件组合使用。


使用 nested 实现 OR 查询

nested 方法可以在 LambdaQueryWrapper 中嵌套一组条件,并通过 .or() 实现 OR 关系。

示例代码

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.lang3.StringUtils;

LambdaQueryWrapper<ArticleDO> wrapper = new LambdaQueryWrapper<>();

// OR 查询:标题或描述匹配关键字
wrapper.nested(StringUtils.isNotBlank(keyword), w ->
    w.like(ArticleDO::getTitle, keyword)
     .or()
     .like(ArticleDO::getDescription, keyword)
);

// 其他 AND 条件
wrapper.eq(ArticleDO::getStatus, 1);
wrapper.eq(categoryId != null, ArticleDO::getCategoryId, categoryId);

生成的 SQL

如果 keyword = "Java"status = 1categoryId = 5,生成的 SQL 大致如下:

WHERE (title LIKE '%Java%' OR description LIKE '%Java%')
  AND status = 1
  AND category_id = 5
  • 括号保证了 OR 条件优先执行
  • AND 条件可以自由组合
  • StringUtils.isNotBlank(keyword) 可以防止关键字为空时添加无效条件

优点

  1. 可控优先级:OR 条件被括号包裹,和其他条件不会冲突
  2. 灵活性高:可以在 nested 中添加任意复杂条件
  3. 安全性:避免手动拼接 SQL,减少 SQL 注入风险
  4. 兼容 AND 条件:OR 条件可以和其他 AND 条件组合,实现复杂查询

小结

  • 使用 nested 可以轻松实现多字段 OR 查询
  • OR 条件和 AND 条件可以灵活组合
  • 推荐在关键字搜索或多字段匹配场景下使用