Bootstrap

关于mybatis-plus的and和or问题

关于mybatis-plus条件构造器的and和or的拼接问题

sql 语句里and和or是有执行优先级的

mybatis-plus 提供的条件构造器但有时需要复杂嵌套写法的时候不能直接拼接

代码如下 (当个例子就好,为了可读性删了很多东西)
LambdaQueryWrapper<Report> wrapper = new LambdaQueryWrapper(reportQuery);
wrapper.ne(Report::getPeopleCounts, 0).or().ne(Report::getRemark, ""));
wrapper.ge(Report::getCreateTime,report.getStartDate())
    .lt(Report::getCreateTime, report.getEndDate());
因为选用的框架会自动根据逻辑删除字段搜索所以拼接生成的sql如下
SELECT * FROM tb_report WHERE is_deleted =0 AND (
 people_counts>0 OR remark !='' 
 AND create_time>='2022-10-18 12:00:00' 
 AND create_time<'2022-10-20 12:00:00')
实际上并没有查到想要的数据,请教了别人发现括号优先级不对
正确的写法如下
LambdaQueryWrapper<Report> wrapper = new LambdaQueryWrapper(reportQuery);

wrapper.and(exportWrapper->exportWrapper.ne(Report::getPeopleCounts,0).or().ne(Report::getRemark, ""));

wrapper.ge(Report::getCreateTime,report.getStartDate())
    .lt(Report::getCreateTime, report.getEndDate());
这样写生成的sql如下
SELECT * FROM tb_report WHERE is_deleted =0 AND (
(people_counts>0 OR remark !='') 
 AND create_time>='2022-10-18 12:00:00' 
 AND create_time<'2022-10-20 12:00:00')

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;