这篇文章要分享的是在项目里遇到的一个需要写and语句嵌套的问题,实际的SQL语句如下:
select * from equipment
where role_id = "228413562" and (type = 1 or type = 2)
但是查询的时候的条件构造器是这样写的(不知道当时写代码的时候,自己是咋想的oVo)
// 查询角色的装备(武器+衣服)
QueryWrapper<Equipment> wrapper = new QueryWrapper<>();
wrapper.eq("role_id", roleId);
wrapper.eq("type", EquipmentTypes.WUQI.getValue());
wrapper.or().eq("type", EquipmentTypes.YIFU.getValue());
List<Equipment> list = equipmentMapper.selectList(wrapper);
上面的代码导致了查询的数据和实际的数据不一致,因为上面的sql语句对应是这样的
select * from equipment
where role_id = "228413562" and type = 1 or type = 2
为了解决这个问题,又去MyBatis-Plus源代码里看了一下有没有类似的方法可以给and条件里的多个条件加上一对括号。
最后发现:MP果然给我们提供了条件嵌套的两个方法。
- and()
- nested()
最后,经过了几次踩坑终于把SQL语句构造好了~
// 查询角色的装备(武器+衣服)
QueryWrapper<Equipment> wrapper = new QueryWrapper<>();
wrapper.eq("role_id", roleId);
wrapper.and(new Consumer<QueryWrapper<Equipment>>() {
@Override
public void accept(QueryWrapper<Equipment> queryWrapper) {
queryWrapper.eq("type", EquipmentTypes.WUQI.getValue());
queryWrapper.or();
queryWrapper.eq("type", EquipmentTypes.YIFU.getValue());
}
});
List<Equipment> list = equipmentMapper.selectList(wrapper);
控制台打印了正确的SQL语句