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


    前言

    大家用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

  • 相关阅读:
    编写SPI设备驱动程序
    装备制造业的变革时代,SCM供应链管理系统如何赋能装备制造企业转型升级
    hbase hdfs path
    .net技术----类和对象
    Docker:Harbor
    一个简单的删除,我发现这么多知识...
    Script file ‘F:.....\pip-script.py‘ is not present 原因及解决办法
    [Cesium]设置点Entity的
    猿创征文 第二季|业务总结 #「笔耕不辍」--生命不息,写作不止#
    一文了解自定义表单系统开源的多个优势
  • 原文地址:https://blog.csdn.net/fxzzq/article/details/126078959