记MyBatis-Plus使用中or()使用避坑,多条件使用or之后生成的语句查询结果成为or两边的合集,目标结果是只有or两边的条件去做“或”比较

下面来看一个MyBatis-Plus查询语句,希望实现的查询效果是根据GalaxyActivity对象的code和状态确定内容后进行ShowId、Name两个字段的查询操作

galaxyActivityService.list(new LambdaQueryWrapper<GalaxyActivity>()
.eq(GalaxyActivity::getGalaxyCode,galaxyCode)
.eq(GalaxyActivity::getIsShow, Constants.YES)
.gt(GalaxyActivity::getStatus,Constants.NO)
.like(GalaxyActivity::getShowId,keyWords)
.or().like(GalaxyActivity::getName,keyWords)
)

以上写法生成的sql

SELECT * FROM galaxy_activity WHERE (galaxy_code = ? AND is_show = ? AND status > ? AND show_id LIKE ? OR name LIKE ?)

查询结果及为or后的全表搜索name匹配内容,显然不是我们所需要的,那么如何在两个or外面加一个括号来实现我们想要的查询:

galaxyActivityService.list(new LambdaQueryWrapper<GalaxyActivity>()
.eq(GalaxyActivity::getGalaxyCode,galaxyCode)
.eq(GalaxyActivity::getIsShow, Constants.YES)
.gt(GalaxyActivity::getStatus,Constants.NO)
.and(
queryWrapper -> queryWrapper
.like(GalaxyActivity::getShowId,keyWords)
.or().like(GalaxyActivity::getName,keyWords)
	)
)

调整后生成的sql

SELECT * FROM galaxy_activity WHERE (galaxy_code = ? AND is_show = ? AND status > ? AND (show_id LIKE ? OR name LIKE ?))

其实第一种写法在熟悉MyBatis-Plus的方法之后很容易避免,只是在使用初期容易有这样的思维误差,习惯性跟写sql一样就写下来了,只要回顾一下还是可以避免的,最后希望本次避坑贴可以帮到更多的同学

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐