动态 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 以提高灵活性和可维护性。