目录
项目场景:
项目中有个启用/禁用功能,当模板或主题在使用的时候(如:类似csdn的模板或主题),是不允许禁用
问题描述:
deleteMark = 0 、status=0或status=1 三个条件进行拼接,如下查出来多条
public int getInfoFromMaster(String id) {
QueryWrapper<MasterEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(MasterEntity::getLayoutId, id);
//有效信息 EnabledMark=1 and DeleteMark=0
//queryWrapper.lambda().eq(MasterEntity::getEnabledMark, StaticConfigTool.DEFAULT_VALID);//1
//queryWrapper.lambda().eq(MasterEntity::getDeleteMark, StaticConfigTool.DEFAULT_INVALID);//0
//删除信息数据(进回收站) EnabledMark=0 and DeleteMark=0
//queryWrapper.lambda().eq(MasterEntity::getEnabledMark, StaticConfigTool.DEFAULT_INVALID);//0
//queryWrapper.lambda().eq(MasterEntity::getDeleteMark, StaticConfigTool.DEFAULT_INVALID);//0
//母版中无调用数据 条件用 deletemark = 0 的数据 (回收站的引用数据也算)
queryWrapper.lambda().eq(MasterEntity::getDeleteMark, StaticConfigTool.DEFAULT_INVALID);
queryWrapper.lambda().eq(MasterEntity::getStatus, StaticConfigTool.RELEASE).//1 发布
or().eq(MasterEntity::getStatus, StaticConfigTool.UNPUBLISHED);//0 草稿
return masterService.count(queryWrapper);
}
原因分析:
and 和 or 条件拼接有问题:
queryWrapper.lambda().eq(MasterEntity::getDeleteMark, StaticConfigTool.DEFAULT_INVALID);
queryWrapper.lambda().eq(MasterEntity::getStatus, StaticConfigTool.RELEASE).//1 发布
or().eq(MasterEntity::getStatus, StaticConfigTool.UNPUBLISHED);//0 草稿
去数据库查询分析:
步骤1、如上拼接,写sql去数据库查询,结果有18条数据
SELECT COUNT( 1 ) FROM base_master_management WHERE (F_LAYOUTID = '790d8c3544474ffd8435d8ec2f004984' AND F_DELETEMARK = 0 AND F_Status = 1 OR F_Status = 0)
步骤2、直接用 id 查询,只有三条数据。说明步骤1的 sql 肯定有问题
SELECT * FROM base_master_management WHERE F_LAYOUTID = '790d8c3544474ffd8435d8ec2f004984'
步骤3、修正 sql 后 查询
SELECT COUNT( 1 ) FROM base_master_management WHERE (F_LAYOUTID = '790d8c3544474ffd8435d8ec2f004984' AND F_DELETEMARK = 0 AND (F_Status = 1 OR F_Status = 0))
解决方案:
根据修正后的sql,写相应 java myBatisPlus 拼接代码,如下:
queryWrapper.lambda().eq(MasterEntity::getDeleteMark, StaticConfigTool.DEFAULT_INVALID);
queryWrapper.lambda().and(t-> t.eq(MasterEntity::getStatus, StaticConfigTool.RELEASE).//1 发布
or().eq(MasterEntity::getStatus, StaticConfigTool.UNPUBLISHED));//0 草稿