mybatis中的lt、le、eq、ne、ge、gt

lt、le、eq、ne、ge、gt

  • lt:less than 小于
  • le:less than or equal to 小于等于
  • eq:equal to 等于
  • ne:not equal to 不等于
  • ge:greater than or equal to 大于等于
  • gt:greater than 大于

查看mybatis的SQL语句

System.out.println(sysBeforeUserQueryWrapper.getSqlSegment());
System.out.println(sysBeforeUserQueryWrapper.getTargetSql()); 
(id LIKE #{ew.paramNameValuePairs.MPGENVAL1} AND end_time IS NULL OR end_time < #{ew.paramNameValuePairs.MPGENVAL2} AND account LIKE #{ew.paramNameValuePairs.MPGENVAL3}) ORDER BY create_time DESC 
(id LIKE ? AND end_time IS NULL OR end_time < ? AND account LIKE ?) ORDER BY create_time DESC  

使用or()导致查询结果错误

当使用如下语句时查询的结果有偏差甚至查询失败:

Date now = new Date(); 
if (pageParam.getIsVip().equals("YES")) {
    sysBeforeUserQueryWrapper.lambda().ge(SysBeforeUser::getEndTime, now);
} else {
    sysBeforeUserQueryWrapper.lambda().isNull(SysBeforeUser::getEndTime).or().lt(SysBeforeUser::getEndTime, now);
} 

或者:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss");

sysBeforeUserQueryWrapper.lambda().ge(SysBeforeUser::getEndTime, simpleDateFormat.format(now));

sysBeforeUserQueryWrapper.lambda().isNull(SysBeforeUser::getEndTime).or().lt(SysBeforeUser::getEndTime, simpleDateFormat.format(now));
}

分情况分析:
① 查询结果正确的SQL语句(or条件后面还有and条件):

 ==>  Preparing: SELECT COUNT(*) AS total FROM sys_before_user WHERE (id LIKE ? AND end_time IS NULL OR end_time < ? AND account LIKE ?)
 ==> Parameters: %744990042990178305%(String), 2024-01-10 16:03:07.003(Timestamp), %7307453%(String) 

或者:

 ==>  Preparing: SELECT COUNT(*) AS total FROM sys_before_user WHERE (id LIKE ? AND end_time IS NULL OR end_time < ? AND account LIKE ?)
 ==> Parameters: %744990042990178305%(String), 2024-01-10 16:01:21(String), %7307453%(String)

② 查询失败的SQL语句(or条件后没有约束条件了):

 ==>  Preparing: SELECT COUNT(*) AS total FROM sys_before_user WHERE (id LIKE ? AND end_time IS NULL OR end_time < ?)
 ==> Parameters: %744990042990178305%(String), 2024-01-10 16:04:50.018(Timestamp) 

或者:

 ==>  Preparing: SELECT COUNT(*) AS total FROM sys_before_user WHERE (id LIKE ? AND end_time IS NULL OR end_time < ?)
 ==> Parameters: %744990042990178305%(String), 2024-01-10 16:06:35(String) 

分析以上成功或失败的原因:
查看以下语句可知查询条件先后顺序会影响结果:
1、对于情况① (id like ?、account like ?、end_time < ? 或 end_time IS NULL)应当是:

SELECT COUNT(*) AS total FROM sys_before_user WHERE (id LIKE ? AND (end_time IS NULL OR end_time < ?)) AND account LIKE ? 

不过,SELECT COUNT(*) AS total FROM sys_before_user WHERE (id LIKE ? AND end_time IS NULL OR end_time < ? AND account LIKE ?)也是正确的。
2、对于情况② 则完全错误(id like ?、end_time < ? 或 end_time IS NULL),应当是:

SELECT COUNT(*) AS total  FROM sys_before_user  WHERE (id LIKE ? AND (end_time IS NULL OR end_time < ?))

问题主要是出在 end_time 参数中,该参数得条件应该用括号包裹,即 (end_time IS NULL OR end_time < ?) 才对!

sysBeforeUserQueryWrapper.lambda().and(wrapper -> wrapper.isNull(SysBeforeUser::getEndTime).or().lt(SysBeforeUser::getEndTime, now)); 

对应的SQL语句条件如下:

SELECT * FROM your_table WHERE some_other_conditions AND (end_time IS NULL OR end_time < ?)
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis-Pluseq是一个查询条件,表示等于。它可以用于LambdaQueryWrapper或QueryWrapper对象,用于构建查询条件。在LambdaQueryWrappereq方法接受两个参数,第一个参数是实体类的字段,第二个参数是要匹配的值。例如,lqDevice.eq(TbCloudbox::getStreetNumber, "1354322180948406274")表示查询TbCloudbox表StreetNumber字段等于"1354322180948406274"的记录。\[1\] eq方法的作用是生成一个等于条件的SQL语句,用于查询满足条件的记录。它是Mybatis-Plus提供的一种方便的查询方式,可以简化SQL语句的编写。除了eq方法,Mybatis-Plus还提供了其他一些方法,如ne(不等于)、gt(大于)、lt(小于)、ge(大于等于)、le(小于等于)、in(包含)、isNull(等于null)、between(在两个条件之间)、like(模糊查询)等,用于构建不同类型的查询条件。\[2\] 总结起来,eq方法是Mybatis-Plus用于构建等于条件的查询方法,可以用于LambdaQueryWrapper或QueryWrapper对象。它可以简化SQL语句的编写,提高开发效率。\[1\]\[2\] #### 引用[.reference_title] - *1* *3* [Mybatis-Plus项目使用eq()](https://blog.csdn.net/ddd295569371/article/details/117296110)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Mybatis-Plus eqnegtltgele分别代表含义](https://blog.csdn.net/weixin_45723046/article/details/124569887)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值