MyBatis-Plus 的 QueryWrapper 应用以及在内存中处理JSON数组字符串匹配

news/2025/10/9 21:01:48/文章来源:https://www.cnblogs.com/ztn195/p/19131971

需求分析:

咨询师筛选:

列表浏览:展示“全部咨询师”列表,包含姓名、从业时长、擅长领域、用户好评率等基础信息;精准筛选:支持按“困扰类型(如焦虑、婚姻家庭)”“性别”“咨询方式”“流派”标签筛选;关键词搜索:通过搜索框输入咨询师姓名、擅长领域等关键词查找目标咨询师;

具体实现:

直接把搜索和筛选条件放到couselorDTO中

// 搜索和筛选条件private String keyword;private List<String> specializationTags;private List<String> therapeuticApproachTags;private List<String> serviceTypeTags;private String genderFilter;

/*** 搜索和筛选咨询师(支持关键词搜索和多维度筛选)* 实现策略:数据库查询 + 内存筛选* * @param counselorDTO 包含搜索条件和筛选条件的DTO对象* @return 符合条件的咨询师DTO列表*/@Overridepublic List<CounselorDTO> searchAndFilterCounselors(CounselorDTO counselorDTO) {// 第一步:构建基础查询条件(使用MyBatis-Plus的QueryWrapper)QueryWrapper<Counselors> queryWrapper = new QueryWrapper<>();// 关键词搜索:在多个字段中进行模糊匹配if (StringUtils.hasText(counselorDTO.getKeyword())) {String keyword = "%" + counselorDTO.getKeyword() + "%";// 使用AND连接主条件,内部使用OR连接多个字段的模糊查询queryWrapper.and(wrapper -> wrapper.like("real_name", keyword)           // 真实姓名匹配.or().like("specialization", keyword) // 擅长领域匹配.or().like("therapeutic_approach", keyword) // 治疗流派匹配.or().like("introduction", keyword)   // 个人介绍匹配);}// 状态筛选:默认只查询已通过审核的咨询师// 确保只有审核通过的咨询师才会出现在搜索结果中queryWrapper.eq("status", "APPROVED");// 执行数据库查询,获取基础结果集List<Counselors> counselorsList = baseMapper.selectList(queryWrapper);// 第二步:将实体对象转换为DTO对象,并关联用户信息和服务设置List<CounselorDTO> result = new ArrayList<>();for (Counselors counselor : counselorsList) {CounselorDTO dto = convertToDTO(counselor);result.add(dto);}// 第三步:在内存中进行复杂的标签筛选(因为涉及JSON字段解析)// 注意:这里没有使用XML中定义的filterByTags方法,而是在内存中处理if (!CollectionUtils.isEmpty(counselorDTO.getSpecializationTags()) || !CollectionUtils.isEmpty(counselorDTO.getTherapeuticApproachTags()) || !CollectionUtils.isEmpty(counselorDTO.getServiceTypeTags()) || StringUtils.hasText(counselorDTO.getGenderFilter())) {List<CounselorDTO> filteredResult = new ArrayList<>();for (CounselorDTO dto : result) {boolean match = true; // 标记当前咨询师是否匹配所有筛选条件// 擅长领域筛选:检查咨询师的擅长领域是否包含任一指定的标签if (match && !CollectionUtils.isEmpty(counselorDTO.getSpecializationTags()) && StringUtils.hasText(dto.getSpecialization())) {match = counselorDTO.getSpecializationTags().stream().anyMatch(tag -> dto.getSpecialization().contains(tag) // 使用contains进行简单匹配);}// 治疗流派筛选:检查咨询师的治疗流派是否包含任一指定的标签if (match && !CollectionUtils.isEmpty(counselorDTO.getTherapeuticApproachTags()) && StringUtils.hasText(dto.getTherapeuticApproach())) {match = counselorDTO.getTherapeuticApproachTags().stream().anyMatch(tag -> dto.getTherapeuticApproach().contains(tag));}// 服务类型筛选:检查咨询师的服务类型是否包含任一指定的标签if (match && !CollectionUtils.isEmpty(counselorDTO.getServiceTypeTags()) && StringUtils.hasText(dto.getServiceTypes())) {match = counselorDTO.getServiceTypeTags().stream().anyMatch(tag -> dto.getServiceTypes().contains(tag));}// 性别筛选:精确匹配性别if (match && StringUtils.hasText(counselorDTO.getGenderFilter()) && StringUtils.hasText(dto.getGender())) {match = counselorDTO.getGenderFilter().equals(dto.getGender());}// 如果所有条件都匹配,则加入最终结果集if (match) {filteredResult.add(dto);}}result = filteredResult; // 更新结果为筛选后的列表}return result;}

接口文档:

**请求URL**:`/api/counselors/search`**请求方法**:POST**请求参数**:```json
{"keyword": "string", // 搜索关键词(姓名、擅长领域等)"specializationTags": ["string"], // 擅长领域标签列表"therapeuticApproachTags": ["string"], // 治疗流派标签列表"serviceTypeTags": ["string"], // 服务类型标签列表"genderFilter": "string" // 性别筛选(MALE/FEMALE/UNKNOWN)
}

响应参数

[{"counselorId": 1, // 咨询师ID"userId": 10, // 用户ID"realName": "张医生", // 真实姓名"username": "doctor_zhang", // 用户名"phone": "13800138000", // 手机号"email": "zhang@example.com", // 邮箱"gender": "MALE", // 性别"age": 35, // 年龄"qualificationCertificateUrl": "https://example.com/certificate/1", // 资质证书URL"practiceCertificateUrl": "https://example.com/practice/1", // 执业证书URL"photoUrl": "https://example.com/photo/1", // 证件照URL"yearsOfExperience": 10, // 从业年限"specialization": "[\"焦虑\",\"抑郁\"]", // 擅长领域"therapeuticApproach": "[\"认知行为\",\"人本主义\"]", // 治疗流派"introduction": "从事心理咨询工作10年...", // 个人介绍"consultationFee": 200.00, // 咨询费用"rating": 4.80, // 平均评分"totalSessions": 200, // 总咨询次数"counselorStatus": "APPROVED", // 咨询师状态"serviceTypes": "[\"文字\",\"语音\",\"视频\"]", // 服务类型"availableDays": "[\"周一\",\"周三\",\"周五\"]", // 可用日期"workingHours": "{\"morning\":[\"9:00\",\"12:00\"],\"afternoon\":[\"14:00\",\"18:00\"]}", // 工作时间段"sessionDurations": "[30,60,90]", // 支持的咨询时长"maxDailySessions": 5, // 每日最大咨询次数"createdTime": "2023-01-01T10:00:00", // 创建时间"updatedTime": "2023-01-01T10:00:00" // 更新时间}
]

状态码

  • 200:查询成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/933846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P9461 「EZEC-14」众数 II

思路:若区间包含的\(a_i\)完整,最小众数为\(1\);若\(a_l\)只有后缀\([x,a_l]\)且\(a_r\)只有前缀\([1,y]\),当且仅当\(\forall i \in [l,r], a_i \ge x\)时最小众数是\(x\),否则为\(1\)。为方便求解,先求出所有最…

从 ZooKeeper 到 ELK:分布式中间件与日志分析系统全解析 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

详细介绍:win11 安装 WSL2 Ubuntu 并支持远程 SSH 登录

详细介绍:win11 安装 WSL2 Ubuntu 并支持远程 SSH 登录pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

Ai元人文:论智能的“全息定帧”与“渐进式显影”机制

Ai元人文:论智能的“全息定帧”与“渐进式显影”机制 ——对“悟空之眼”AI元人文架构的关键补充 引言:被忽略的“灵感成本” 在构建拥有“悟空之眼”的创造性AI时,我们惯常的思维是:系统在“顿悟”的瞬间,就应直…

24 LCA模拟赛2T4 colorful 题解

Colorful Rectangle 题面 给定 \(n\) 个点,每个点有颜色 \(\in \{0, 1, 2\}\) ,求至少包含三种颜色并且与坐标轴平行的矩形的最小周长。 \(3 \le n \le 10^5\) \(0 \le x_i , y_i \le 10^8\) 题解 这道题思路不难懂,…

23 LCA模拟赛2T2 异或排列 题解

Fast XORting 题面 给定一个 \(2\) 的整数次幂 \(n\) 以及一个 \(0 \sim n - 1\) 的排列 \(a_1, a_2, \cdots a_n\)。 在一次运算中,你可以进行以下两种操作之一:交换两个相邻元素 选择任意整数 \(0 \le x \le n - 1…

SQLAlchemy 库 - 实践

SQLAlchemy 库 - 实践2025-10-09 20:49 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-…

Bugkuctf的哥哥的秘密

描述: 哥哥的秘密都藏在妹妹的空间里了 这是妹妹的QQ:2492853776 去找找哥哥藏起来的旗帜吧 构造:http://user.qzone.qq.com/QQ号码/infocenter?via=toolbar https://user.qzone.qq.com/2492853776hint1:解题流程为…

国庆做题记录(基础算法)

这篇文章信息量偏大,请谨慎阅读,注意高效利用右边的目录。 其他部分咕咕咕地更新中……敬请期待 1.1 二分 & 双指针 关联博文:Atserkcn-0/1分数规划 P1404 平均数 既然要让子串平均数最大,那就二分平均数,判断…

【MySQL学习笔记】数据库的CURD(一) - 详解

【MySQL学习笔记】数据库的CURD(一) - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

fp16训练神经网络时出现nan问题

问题总结:nan 问题 现象: 在训练过程中,训练损失(Train Loss)和测试损失(Test Loss)的值变为 nan(Not a Number)。这通常意味着训练过程中出现了数值计算错误或不稳定,导致无法计算出有效的损失值。同时,训…

第十篇

今天是10月9号,返校的第一天,学习了链表的相关知识,也学习了栈的有关知识点。

504 品酒大会!!!!!!

歌曲瑞平!!!!!!目前榜单 省流版:

newDay07

1.今天确实是没学多少,背了背单词,看了会《程序员修炼之道》 2.明天去图书馆静心学学吧,主要是Java这一块,再写写作业 3.过完国庆有点犯懒了

【数据结构】可撤销并查集 - Slayer

可撤销并查集只可以按照加入的时间从后到前撤销加边操作。 具体的,我们会把所有加入的边压入一个栈,然后当什么时候要撤销时不断从栈顶弹出一条边,撤销掉。而至于具体的撤销步骤,我们假设此边原来是把 y 连向 x,那…

直播美颜sdk的底层逻辑:人脸美型机制的算法与架构解析

直播美颜sdk的底层逻辑:人脸美型机制的算法与架构解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

从开放重定向到XSS:漏洞升级实战

本文详细记录了安全研究员如何发现网站开放重定向漏洞,并通过编码绕过防火墙成功升级为XSS攻击的全过程。文章包含具体的漏洞利用步骤、防火墙绕过技巧和最终的攻击验证,为网络安全爱好者提供了实用的技术参考。从开…

余弦日记

我擦,我不知道2025 年 10 月 2 日,对我来说是传说般的一天,因为我克服了在本科四年间缺乏社交导致的、对陌生人的社交恐惧症,去本地的一个漫展出了余弦。 上一次去漫展,可能是两年前暑假的上海东方 Only,再上一次…

【题解】P11459 [USACO24DEC] Its Mooin Time P

其实是套路题。但有段时间没写过闵可夫斯基和优化 \(dp\) 了,记录一下。 先简单回顾一下闵可夫斯基和。点集 \(P\) 与 点集 \(Q\) 的闵可夫斯基和定义为:\(P+Q=\{a+b|a\in P,b\in Q\}\) 。 对于两个凸包的闵可夫斯基…

创建一个springboot项目,mybatis连接嵌入式数据库H2,实现增删改查功能

@目录目标创建一个spirngboot项目创建流程第一次运行项目,界面如下mybatis连接数据库H2依赖:mybatis + h2配置文件schema.sql实现对用户的增删改查创建entity创建mapper创建service创建controller搭配前端程序,修改…