• mybatis plus QuerManager使用 FIND_IN_SET


    参考:https://blog.csdn.net/xxk666/article/details/110242314

    前言:

    新项目要做一个根据用户数据权限查询用户列表接口,查询逗号分割的数据用like查询会导致数据不准确,然后公司用的是mybatis-plus 我把解决问题过程中的一个坑记录一下,防止大家入坑。

    问题解析:

    说白了就是 一个字段里面的数据是用(,)逗号隔开的,比如:A100,A1001,A1002,B100,B1001,B1002 之类的数据, 然后使用A100去查询 不能查询出来A10010,所以就想到了 FIND_IN_SET ,由于本人比较懒直接百度了下,然后就是看到千篇一律的博客,最后执行sql报错,下面我为大家看下我的解决过程。

    问题展示:


    这位博主和大多数博主几乎是一样的代码,我就随便粘过来一个。可能是考虑的东西太少导致了一些BUG

    博主代码:

    `wrapper.apply(crmSupInfoDTO.getCooperative() != null,"FIND_IN_SET ("+crmSupInfoDTO.getCooperative()+",cooperative)");` 
    
    *   1
    
    
    

    注意问题:

    如果数据库存的是数字,那么运行是没有问题的。下面看我的运行结果。

    数据库数据结构:

    在这里插入图片描述

    接下来是字符串的数据
    在这里插入图片描述

    数据库数据结构:

    在这里插入图片描述

    解决问题:

    出现这个问题的时候我感觉很奇怪,我怕用程序员最严格的开发规范 Ctrl+c Ctrl+v 来进行的开发,因为之前已经写过一个类似的功能,感觉不会有问题,没想到阴沟翻船。

    1. 对比sql
    执行正确sql:

    `SELECT
    *
    FROM
    	expert_info 
    WHERE
    	FIND_IN_SET ( 1, specialty_or_field )` 
    
    *   1
    *   2
    *   3
    *   4
    *   5
    *   6
    
    
    

    执行错误sql:

    `SELECT
    	id,
    	user_code,
    	direction_authorization_code,
    	direction_authorization_name,
    	scope_authorization,
    	no_scope_authorization,
    	remark,
    	create_time,
    	update_time,
    	DATA,
    	data_user_code,
    	data_user_name 
    FROM
    	user_authorization 
    WHERE
    	FIND_IN_SET ( JT0137000, DATA )` 
    
    ![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
    
    *   1
    *   2
    *   3
    *   4
    *   5
    *   6
    *   7
    *   8
    *   9
    *   10
    *   11
    *   12
    *   13
    *   14
    *   15
    *   16
    *   17
    *   18
    
    
    

    最后发现 入参 JT0137000 字符串没加引号(’’)

    然后修改代码:

    修改前:

     `queryWrapper.apply(branchCode != null,"FIND_IN_SET ("+branchCode+",data)");` 
    
    *   1
    *   2
    
    
    

    修改后:

     `queryWrapper.apply(branchCode != null,"FIND_IN_SET ('"+branchCode+"',data)");` 
    
    *   1
    *   2
    
    
    

    然后就万事大吉,一路高歌没bug



    结论:

    大家以后有需要 查询符号分割的数据结构时候,用 like 会查询到多余数据,大家可以使用FIND_IN_SET 函数,切记一定要加冒号,我把正确的代码写在下面,大家可以自行copy

    正确的代码:

    `queryWrapper.apply( 入参 != null,"FIND_IN_SET ('"+ 入参 +"', 字段名 )");` 
    
    *   1
    
    
    
  • 相关阅读:
    项目测试与部署
    使用技术及部分代码截选
    校园电子设备报修回收系统需求分析
    java lambda expression
    Domain logic approaches
    Spring AOP Capabilities ang goals
    CDI Features
    JAVA DESIGN PATTERN
    LDAP & Implementation
    spring ref &history&design philosophy
  • 原文地址:https://www.cnblogs.com/kuangke/p/16880948.html
Copyright © 2020-2023  润新知