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