微前端架构如何改变企业的开发模式与效率提升
801
2023-04-24
MyBatisPlus中使用or()和and()遇到的问题及细节处理
在项目中使用MyBatisPlus中的or()查询时由于误用,导致查询数据不对,仅作记录。
写法一:
LambdaQueryWrapper
queryWrapper
.eq(Task::getUserId, "15")
.eq(Task::getStatus, 2)
.or()
.eq(Task::getFileSize, 3251544304L);
上面这种写法等价于下面的sql
SELECT * FROM task WHERE user_id = ? AND status = ? OR file_size = ?
写法二:
LambdaQueryWrapper
queryWrapper2
.eq(Task::getUserId, "15")
.and(wrapper -> wrapper.eq(Task::getStatus, 2).or().eq(Task::getFileSize, 3251544304L));
上面这种写法对应的sql如下
SELECT * FROM task WHERE user_id = ? AND ( status = ? OR file_size = ? )
SpringBoot 集成 MyBatisPlus 配置文件添加以下配置即可在控制台查看 sql
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
PS:下面看下Mybatis中and和or的细节处理
当一条SQL中既有条件查又有模糊查的时候,偶尔会遇到这样的and拼接问题。参考如下代码:
select * from ***
where
a = #{a}
and b in
#{item}
and name like '%${c}%' or code like '%${c}%'
order by id desc
limit #{limit} offset #{page}
这样写的错误是如果a==null那么第二个条件中就会多一个and,语句会变成select * from *** where and b in (...),而如果条件全都不满足的话SQL会变成select * from *** where order by id desc limit...解决办法:加上
select * from ***
a = #{a}
and b in
#{item}
and name like '%${c}%' or code like '%${c}%'
order by id desc
limit #{limit} offset #{page}
如上代码所示,加上一个
select * from ***
a = #{a}
and b in
#{item}
and (name like '%${c}%' or code like '%${c}%')
order by id desc
limit #{limit} offset #{page}
总结
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~