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


posted @ 2022-11-11 16:32  狂客  阅读(173)  评论(0编辑  收藏  举报