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 = 1
,categoryId = 5
,生成的 SQL 大致如下:
WHERE (title LIKE '%Java%' OR description LIKE '%Java%')
AND status = 1
AND category_id = 5
- 括号保证了 OR 条件优先执行
- AND 条件可以自由组合
StringUtils.isNotBlank(keyword)
可以防止关键字为空时添加无效条件
优点
- 可控优先级:OR 条件被括号包裹,和其他条件不会冲突
- 灵活性高:可以在
nested
中添加任意复杂条件 - 安全性:避免手动拼接 SQL,减少 SQL 注入风险
- 兼容 AND 条件:OR 条件可以和其他 AND 条件组合,实现复杂查询
小结
- 使用
nested
可以轻松实现多字段 OR 查询 - OR 条件和 AND 条件可以灵活组合
- 推荐在关键字搜索或多字段匹配场景下使用