mysql 多值用逗号隔开的查询及mybatis plus 中实现

在java中mybatis plus中实现查询功能:

QueryWrapper<Userinfo> queryWrapper = new QueryWrapper<>();
//单值
queryWrapper.apply(userinfo.getCompanyIds() != null && !userinfo.getCompanyIds().equals(""), 
                "FIND_IN_SET ('" + userinfo.getCompanyIds() + "',company_id)");
//多值
queryWrapper.apply(userinfo.getCompanyIds() != null && !userinfo.getCompanyIds().equals(""),
                "CONCAT(',',company_id,',') REGEXP ',(" +company_ids+ "),'");// 1|2

本地通过sql验证,单值时也可以使用多值的方法

### 使用 MyBatis-Plus 查询数据库逗号分隔的字段 为了在 MyBatis-Plus查询逗号分隔的字符串,可以采用种方法来处理这种需求。一种常见的做法是在 SQL 查询语句中使用 `FIND_IN_SET` 函数,这使得能够有效地匹配逗号分隔列表中的特定项。 #### 方法一:利用 FIND_IN_SET 进行查询 假设有一个名为 `sys_user` 的表,其中包含一个存储个标签 ID 的列 `tag_ids`,这些 ID 是由逗号隔开来的字符串形式保存。如果想要找到所有具有某个特定标签 ID 的记录,则可以通过如下方式构建查询: ```java // 假设要查找 tag_id 为 &#39;3&#39; 的用户 String targetTagId = "3"; QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.apply("FIND_IN_SET({0}, tag_ids)", targetTagId); List<User> usersWithTagThree = userMapper.selectList(queryWrapper); ``` 这段代码创建了一个 `QueryWrapper` 对象并调用了其 `apply()` 方法来应用自定义条件,在这里就是 MySQL 提供的 `FIND_IN_SET` 函数[^1]。 #### 方法二:通过 Java 逻辑分割字符串再比较 另一种更灵活的方式是先获取所有的数据,然后在应用程序层面解析那些逗号分隔的数据,并根据业务逻辑筛选出符合条件的结果集。这种方式虽然效率较低,但在某些情况下可能更加适用,特别是当涉及到复杂的业务规则时。 ```java public List<User> getUsersByTags(List<String> tags) { // 获取全部用户信息 List<User> allUsers = userMapper.selectList(null); // 定义返回结果集合 List<User> matchedUsers = new ArrayList<>(); for (User user : allUsers) { if (user.getTagIds() != null && !user.getTagIds().isEmpty()) { Set<String> userTagsSet = Arrays.stream(user.getTagIds().split(",")) .map(String::trim) .collect(Collectors.toSet()); boolean matchFound = true; for (String tag : tags) { if (!userTagsSet.contains(tag)) { matchFound = false; break; } } if (matchFound) { matchedUsers.add(user); } } } return matchedUsers; } ``` 这种方法适用于需要进一步加工或验证的情况,比如检查是否存在重复条目等问题。不过需要注意的是,此方案可能会带来性能上的挑战,尤其是在面对大量数据的时候。 #### 注意事项 对于上述两种解决方案的选择取决于具体的应用场景以及系统的性能考量因素。通常建议优先考虑直接在数据库层面上完成过滤操作,因为这样不仅可以减轻服务器端的压力,还能提高整体响应速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值