• 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

  • 相关阅读:
    idea不能设置包名为con
    C#使用OpenCv(OpenCVSharp)图像轮廓多边形逼近和轮廓最小矩形实例
    操作服务器的神奇工具Tmux
    使用venv创建python虚拟环境
    书生·浦语大模型实战营之Llama 3 高效部署实践(LMDeploy 版)
    NX二次开发-调内部函数UGS::UICOMP_enum::set_width(int)更改BlockUI的枚举控件宽度
    编解码器问题---流媒体稳定
    分布式锁:5种方案解决商品超卖的方案
    java基于SpringBoot+Vue的自媒体社区交流平台 element
    【C语言】预处理详解
  • 原文地址:https://blog.csdn.net/fxzzq/article/details/126078959