使用了LambdaQueryWrapper的and(),以下java代码运行后sql语法报错:where 后面多拼接了and,怎么解决? default List<WmsStock> queryStockByScanTrayCartonCodeMaterialsn(String deptCode, String trayCode, String CartonCode, String materialSn) { LambdaQueryWrapper<WmsStock> wrapper = Wrappers.lambdaQuery(); wrapper.eq(WmsStock::getDeptCode, deptCode) //要查大于0的,扫码拣货时把数量改成了0,但是数据并未删除,不加这个条件就可用重复扫同一个条码 .gt(WmsStock::getStockNum, BigDecimal.ZERO) .eq(StringUtils.isNotBlank(trayCode), WmsStock::getTrayCode, trayCode) .eq(WmsStock::getStatus, "1"); if (StringUtils.isNotBlank(CartonCode)) { wrapper.and(wq -> wq .eq(StringUtils.isNotBlank(CartonCode), WmsStock::getFirstCasketSn, CartonCode) .or() .eq(StringUtils.isNotBlank(CartonCode), WmsStock::getSecondCartonSn, CartonCode) .or() .eq(StringUtils.isNotBlank(CartonCode), WmsStock::getThirdTraySn, CartonCode)); } else { wrapper.and(w -> { }); } wrapper.eq(StringUtils.isNotBlank(materialSn), WmsStock::getMaterialSn, materialSn); return selectList(wrapper); }
时间: 2024-03-14 08:46:49 浏览: 100
关于SQL语句中的AND和OR执行顺序遇到的问题
5星 · 资源好评率100%
在LambdaQueryWrapper中使用and()方法时,如果前面没有添加任何条件,会导致生成的sql语句where后面多出一个and关键字,因为and()方法会直接将条件拼接到前面的条件上。因此,你可以将and()方法中的条件放在一个Lambda表达式中,这样就可以避免生成多余的and关键字了。具体地,在你的代码中,可以将else分支中的代码改为下面这样:
```
else {
wrapper.and(wq -> {});
}
```
这样就能够避免生成多余的and关键字了。同时,需要注意的是,LambdaQueryWrapper的构建是基于链式调用的,因此在使用and()方法时,要注意将条件拼接到正确的位置上。
阅读全文