尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

MyBatis-Plus 的 QueryWrapper 应用以及在内存中处理JSON数组字符串匹配
📅 发布时间:2026/6/19 14:39:16

需求分析:

咨询师筛选:

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

具体实现:

直接把搜索和筛选条件放到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:查询成功

相关新闻

  • 从 ZooKeeper 到 ELK:分布式中间件与日志分析系统全解析 - 教程
  • 【MySQL学习笔记】数据库的CURD(一) - 详解
  • fp16训练神经网络时出现nan问题

最新新闻

  • 魔都黄金回收暗访实录:24小时上门实测闵行、浦东、松江、静安、普陀五家临街老店,谁才是最良心之选? - 昌福黄金回收
  • 思源宋体终极指南:7种字重免费开源字体解决你的中文排版难题
  • 深入解析S12 MSCAN模块:硬件保护、时钟配置与低功耗设计实战
  • 大模型转型攻略:小白程序员轻松入门,收藏这份从零到精通的学习指南!
  • MPC555/556微控制器架构解析:PowerPC内核、IMB总线与关键外设实战
  • ThumbmarkJS架构解析:从工厂模式到组件管理的设计哲学

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号