当前位置:   article > 正文

mybatis plus in使用时传数组、集合的注意点_mybatisplus in list

mybatisplus in list

前言

大家用mybatis plus时,肯定会用到in。
in在传多个值的时候,有1个坑。

复现

1、postman 给 传入了

{
"signContractStatus":"0,1"
}
  • 1
  • 2
  • 3

2、代码in传入了一个三目表达式 StringUtils.isNotBlank(signContractStatus)?signContractStatusArray:0

其中的signContractStatusArray的定义如下

String[] signContractStatusArray = new String[3];
  • 1

3、通过分隔函数把变成字符串数组signContractStatusArray传入in

.in(StringUtils.isNotBlank(signContractStatus), TCustomerSignRecordEntity::getSignContractStatus,StringUtils.isNotBlank(signContractStatus)?signContractStatusArray:0)
  • 1

执行结果

==>  Preparing: SELECT COUNT(*) AS total FROM t_customer_sign_record WHERE (oa_id = ? AND sign_contract_status IN (?))
==> Parameters: lvying(String), [Ljava.lang.String;@3b6b4d6(String[])
<==    Columns: total
<==        Row: 0
<==      Total: 0
  • 1
  • 2
  • 3
  • 4
  • 5

可以看到 传入的参数 ,在数据库中是应该有数据返回的,结果没有返回,说明问题出在这里。

纠正

不要传上面的传模棱两可的参数(如三目运算符),这样jvm会给你意想不到的结果,直接传serviceRelationArray即可。

.in(StringUtils.isNotBlank(serviceRelation), TCustomerSignRecordEntity::getServiceRelation, serviceRelationArray)
  • 1

正确执行结果

==>  Preparing: SELECT COUNT(*) AS total FROM t_customer_sign_record WHERE (oa_id = ? AND sign_contract_status IN (?, ?))
==> Parameters: lvying(String), 0(String), 1(String)
<==    Columns: total
<==        Row: 13
<==      Total: 1
  • 1
  • 2
  • 3
  • 4
  • 5

这样就能得到我们想要的Parameters了,大功告成!!!

总结in的使用

正确姿势一(List集合):


List ids = Arrays.asList(122L,23L);
new QueryWrapper().lambda().in(Driver::getServiceId,ids);
  • 1
  • 2
  • 3

正确姿势二(数组对象):

Long[] ids={1305679009380433922,1305679009380433922};
LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda().in(Driver::getServiceId,ids);
  • 1
  • 2

正确姿势三(离散值):

new QueryWrapper().lambda()
.in(Driver::getServiceId,1305679009380433922,1305679009380433922);
  • 1
  • 2

错误姿势一(模棱两可的三目表达式):

.in(StringUtils.isNotBlank(vo.getOrderNumList()),ScbgOrder::getOrderNo,
StringUtils.isNotBlank(vo.getOrderNumList())? vo.getOrderNumList().split(",") : "")
  • 1
  • 2

错误姿势二(直接传逗号分隔字符串):
这种也会有出现

.in(StringUtils.isNotBlank(vo.getOrderNumList()),ScbgOrder::getOrderNo,"123,4566");
  • 1

也会出现意想不到的Parameters。

==> Preparing: SELECT * FROM emax_scbg_order WHERE order_no IN (?)

==> Parameters: 1,3(String)

<== Total: 0
  • 1
  • 2
  • 3
  • 4
  • 5

感谢

感谢他们的博客提供的帮助
https://blog.csdn.net/weixin_39578197/article/details/113387131

如果您认为这篇文章还不错或者有所收获,您可以点击右下角的【点赞】支持,或请我喝杯咖啡【赞赏】,这将是我继续写作,分享的最大动力!
作者:勤快的小蚂蚁
声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!
————————————————
版权声明:本文为CSDN博主「勤快的小蚂蚁」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fxzzq/article/details/126078959

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/507666
推荐阅读
相关标签
  

闽ICP备14008679号