在做张贴码导入功能的时候,遇到了一个去重的问题。
后端思想是: 1 读取excel,把每一行数据看成一个实体 2 开始每一行每个实体的校验 3 校验成功后放入集合 4 批量插入数据库
正常想法是在每个实体校验的时候去数据库查询是否存在相同的张贴码,存在则抛出异常,不存在放入集合,批量插入。
但是如果excel中有相同的张贴码相同就校验失败,也能导入了。因为每一行是跟数据库对比是否存在。
解决是在放入集合前,跟集合中每一项在对比一次,不存在了放入集合。或许有人会觉得直接在批量插入数据库前把集合去重了更快。但是目前需求需要让用户知道是哪行报错,不能替用户做决定。所以只能这样。
之后跟项目经理沟通了,需要三个属性确定唯一张贴码,开始开发。
// 1.对excel张贴码属性进行校验
PassCode passCode = getPassCode(rowData, lineNum, user);
// 2.校验成功后 根据三个属性进行判断 跟集合里的张贴码判断
boolean present = passCodeList.stream().filter(p -> {
if (p.getPassName().equals(passCode.getPassName()) && p.getDetailAddress().equals(passCode.getDetailAddress())
&& p.getPosition().equals(passCode.getPosition())){
return true;
} else {
return false;
}
}).findAny().isPresent();
// 3.
if (present){
throw new EhcException("第" + (lineNum + 1) + "行" + "张贴码在导入表中已存在, " + "不能重复导入," +
"请认真检查导入表");
} else {
... 加入集合
passCodeList.add(passCode);
}
其实这样也不是最好的选择,比如excel有1001条数据,第1001条与1000中任意一条相通的话,第一次进行1000次循环,放入数组,第10001条的时候通过校验放入集合前又要循环1000次。
但是目前也没有想到更好的方式了。
|