当前位置: 首页 > news >正文

动态 SQL 或 Criteria 构造 OR 条件,可以实现多字段匹配

使用场景

要实现区域名称的中英文匹配,可以通过动态 SQL 或 MyBatis 的条件构造器实现多字段联合查询。以下是具体实现方法及优化建议:

1. 修改数据库表结构(前提)

确保表中包含中英文名称字段,例如 region_name(中文名)和 region_name_en(英文名)。若表中无英文字段,需先添加字段并补充数据。

2. 调整 MyBatis 查询逻辑

方案一:使用动态 SQL 实现 OR 条件

在 MyBatis 的 Mapper XML 文件中编写动态 SQL,通过 <if><choose> 标签实现中英文匹配逻辑:

<select id="selectByExample" resultMap="BaseResultMap" parameterType="com.example.RegionExample">
  SELECT * FROM region
  <where>
    <if test="criteria != null">
      <!-- 匹配中文或英文名称 -->
      <foreach collection="criteria" item="criterion" separator=" OR ">
        (region_name = #{criterion.value} OR region_name_en = #{criterion.value})
      </foreach>
      AND type = #{type}
      AND del_flag = #{delFlag}
    </if>
  </where>
</select>

方案二:通过 Criteria 构造 OR 条件

在 Java 代码中,利用 MyBatis Generator 生成的 Example 类添加 OR 条件:

RegionExample example1 = new RegionExample();
RegionExample.Criteria criteria1 = example1.createCriteria();
criteria1.andRegionNameEqualTo(request.getRegionName());

// 添加英文名称匹配条件(OR)
RegionExample.Criteria criteria2 = example1.createCriteria();
criteria2.andRegionNameEnEqualTo(request.getRegionName());
example1.or(criteria2);

// 其他条件(AND)
criteria1.andTypeEqualTo(type).andDelFlagEqualTo(DelFlagEnum.NOT_DEL.getState());
List<Region> regions = regionMapper.selectByExample(example1);

3. 支持模糊匹配(可选)

若需支持模糊查询(如部分匹配),可使用 LIKE 语法并拼接通配符:

// Java 代码中设置参数
String searchName = "%" + request.getRegionName() + "%";
criteria1.andRegionNameLike(searchName);
criteria2.andRegionNameEnLike(searchName);

4. 国际化参数处理(高级场景)

若需根据语言环境自动切换匹配字段,可结合国际化配置动态选择字段:

// 从请求上下文获取当前语言
String locale = ContextHolder.getLocale();
String field = "region_name"; // 默认中文
if ("en".equals(locale)) {
    field = "region_name_en";
}
criteria1.andCondition(field + " = '" + request.getRegionName() + "'");

5. 性能优化建议

  • 索引优化:为 region_name 和 region_name_en 字段添加索引,加快查询速度。
  • 避免全表扫描:确保 type 和 del_flag 等筛选条件字段也有索引。

总结

通过动态 SQL 或 Criteria 构造 OR 条件,可以实现区域名称的中英文匹配。若业务涉及多语言场景,可结合国际化配置动态切换匹配字段。具体实现需根据实际表结构和业务需求调整,建议优先使用 XML 动态 SQL 以提高灵活性和可维护性。

相关文章:

  • 物理安全——问答
  • AI大模型使用记录
  • 第五周日志-伪协议(3)
  • 模块化革命:树莓派CM5嵌入式工业计算机如何重构嵌入式系统开发边界
  • 第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(部分题解)
  • Qemu-STM32(十二):STM32F103 框架代码添加
  • STM32F103_LL库+寄存器学习笔记08 - DMA串口发送,开启DMA传输完成中断
  • ip改变导致的数据库连接不上
  • Java中用Stream流取出分组后每组最大值对象的ID
  • 前端 登录页面 案例
  • HarmonyOS NEXT开发实战——组件状态管理
  • 蓝桥杯嵌入式赛道复习笔记8(eeprom读写)
  • 蓝桥杯备考:DFS之数独
  • 渗透测试中发现ak/sk泄露时的验证工具
  • 【Zookeeper搭建(跟练版)】Zookeeper分布式集群搭建
  • 【redis】集群 如何搭建集群详解
  • 用数组遍历出来的页面,随节点创建的ref存储在数据仓库中,如果数据删除,页面相关节点也会删除,数据仓库中随节点创建的ref会不会也同时删除
  • 【蓝桥杯速成】| 14.背包归来
  • C#中如何实现读写分离
  • 使用 SQL CTE(公共表表达式)优化数据查询的实践
  • 网站建设 网址导航/怎么做个网站
  • 关于网站排名优化需要怎么做/网站建设规划要点详解
  • 赛车时时彩网站建设/无锡网站服务公司
  • 怎样建免费网站/合肥网络推广培训学校
  • bing网站提交/深圳seo优化服务
  • 企业网站一般用什么框架做/西安网站制作价格