equBaseInfoSubList为主要基准, openStatusList比它多的要删除,少的要添加。
自己在项目中遇到的,两个表的比对。
主要思想:
数学中的交集思想:A,B两个集合。先找出A,B的交集,A-交集=需要添加的部分;B-交集=需要删除的部分。目测是最为简单的方法。
一开始想从正面去解决,发现要绕很多路,想去找他们的不同部分,结果可以想象,很难实现。脑子一转,可以找他们相同的部分,真是益处多多,少了很多步骤。
如下是两个表的查询list的比对方法,其中主表的guid是从表的外键(equSubId)。
public void importEquBaseInfoSub(List <EquBaseInfoSub> equBaseInfoSubList, List <EquOpenStatus> openStatusList, PageContext pc) throws Exception {
/*openStatus表和equBaseInfoSub表相同的部分*/
List <String> samelist = new ArrayList <String>();
Map <String, Object> subMap = new HashMap <String, Object>();
Map <String, Object> osMap = new HashMap <String, Object>();
for (EquBaseInfoSub sub : equBaseInfoSubList) {
subMap.put(sub.getGuid(), sub);
}
for (EquOpenStatus os : openStatusList) {
osMap.put(os.getEquSubId(), os);
}
Set <String> subSet = subMap.keySet();
Set <String> osSet = osMap.keySet();
/*查找 两个集合相同的部分*/
for (String o : osSet) {
for (String s : subSet) {
if (o.equals(s)) {
samelist.add(o);
continue;
}
}
}
int size = samelist.size();
for (int i = 0; i < size; i++) {
String sameEml = samelist.get(i);
/*获取需要添加的数据 (subSet集合减去samelist)*/
subSet.remove(sameEml);
/*获取需要删除的数据(osSet集合减去samelist)*/
osSet.remove(sameEml);
}
for (String o : osSet) {
//del
EquOpenStatus equOpenStatus = new EquOpenStatus();
equOpenStatus = (EquOpenStatus) osMap.get(o);
pc.putEntity(equOpenStatus);
SpringConfigHelper.getDeleteHandler().execute(pc);
}
for (String s : subSet) {
//add
EquBaseInfoSub equBaseInfoSub = new EquBaseInfoSub();
equBaseInfoSub = (EquBaseInfoSub) subMap.get(s);
final EquOpenStatus equOpenStatus = new EquOpenStatus();
equOpenStatus.setEquSubId(equBaseInfoSub.getGuid());
equOpenStatus.setEquType(EquType.EQU);
equOpenStatus.setOpenDate(sysDate);
equOpenStatus.setOpenFlag("Y");
pc.putEntity(equOpenStatus);
SpringConfigHelper.getSaveHandler().execute(pc);
}
}