• 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

  • 相关阅读:
    JdbcTemplate查询操作
    大数据开发 hadoop集群1. 概论
    Consumer的负载均衡
    关于 自定义的RabbitMQ的RabbitMessageContainer注解-实现原理
    Docker制作镜像并部署bind9(yum安装bind)--use
    SpringBoot 学习(一)自动装配
    记录socket的使用 | TCP/IP协议下服务器与客户端之间传送数据 | java学习笔记
    MAVEN介绍以及安装配置
    Apollo在NetCore实践
    docker进阶作业
  • 原文地址:https://blog.csdn.net/fxzzq/article/details/126078959