一、背景
在阿里的规范中,不允许超过2个JOIN的关联查询,故项目中需要将复杂SQL拆分
二、问题
目前MySQL5.7非特殊场景默认选择utf8mb4,排序选择utf8mb4_general_ci,MySQL8默认选择utf8mb4_0900_ai_ci
当我们使用拆分小查询时,往往使用IN来批量,避免频繁请求、拆解包、解析、执行,这时候我们需要将唯一建以Map的Key形式返回
List<Company> companyList = companyService.list();
List<String> codeList = companyList.stream()
.map(Company::getCode)
.collect(Collectors.toList());
Map<String, List<Client>> clientByComCode = clientService.getByCompanyCode(codeList);
companyList.foreach(o -> {
String companyCode = o.getCode();
List<Client> clientList = clientByComCode.get(companyCode);
})
由于Client是对接第三方的数据,未知的原因造成一部分Code是大写,一部分是小写,在clientService查询时都能命中,但是clientByComCode的get方法无法命中,就形成一种MySQL不区分大小写,但是Java中是区分的
三、解决
- 所有数据入库的时候都转成大写
- 在查询返回时用函数转成大写,查询时也用大写
- 重写Map类或者Map工具类,支持忽略大小写