批量插入VO遇到的问题

需求:批量插入一些对象。

调用方法:

public void saveBatch(String str, LwsQResult model) {
			// TODO Auto-generated method stub
			
			String[] sampleIdParent = str.split("\\|");

	        
			for(int i=0;i<sampleIdParent.length;i++){
model.setId("");   // ① 
model.setdel("0");
model.setSampleParentId(sampleIdParent[i]);
dao.save();
dao.flash();

}
}

 model的大部分属性都是相同的,只有每个model的Id,del,SampleParentId是不相同的。

 刚开始编写时没有①, 这样当循环的i=1时就变成了对原vo的修改,而不是再增加一条,故考虑修改vo的Id,想让他以另一个对象的形式插入数据库中,但执行到i=1时就报错误了,原因是vo和数据库已经同步了,这时不能在修改该vo的主键。

 所以这种批量存储VO只能每次新建个对象来赋值。

 

另外,如果dao.flash()后增加一句:model.setdel("1"); 那么最后插入数据库中的del为1,不用再执行merge或flash就可与数据库同步。

int sort = 1; //数据校验 for(ImportExcelVO vo : sheet1DataList){ boolean errorFlag = false; BaseSetMaterial material = new BaseSetMaterial(); BaseSetWarehouse warehouse = new BaseSetWarehouse(); BigDecimal confirmQuantity = ZERO; //物料校验 if(Objects.isNull(vo.getMaterialName())){ errMsgList.add("第" + sort + "行,物料名称为空!\n"); errorFlag = true; } if(Objects.isNull(vo.getMaterialCode())){ errMsgList.add("第" + sort + "行,物料编码为空!\n"); errorFlag = true; }else{ materialStrList.add(vo.getMaterialCode()); String sqlForMaterial = "SELECT * FROM BASESET_MATERIALS WHERE VALID = 1 AND CODE = ?"; List<BaseSetMaterial> materialList = preNeedDetailDao.createNativeQuery(sqlForMaterial, BaseSetMaterial.class, vo.getMaterialCode()).list(); if(materialList.isEmpty()){ errMsgList.add("第" + sort + "行,未找到对应物料!\n"); errorFlag = true; }else{ material = materialList.get(0); } } //仓库校验 if(Objects.isNull(vo.getWarehouseCode())){ errMsgList.add("第" + sort + "行,仓库编码为空!\n"); errorFlag = true; }else{ String sqlForWarehouse = "SELECT * FROM BASESET_WAREHOUSES WHERE VALID = 1 AND CODE = ?"; List<BaseSetWarehouse> wareHouseList = preNeedDetailDao.createNativeQuery(sqlForWarehouse, BaseSetWarehouse.class, vo.getWarehouseCode()).list(); if(wareHouseList.isEmpty()){ errMsgList.add("第" + sort + "行,未找到对应仓库!\n"); errorFlag = true; }else{ warehouse = wareHouseList.get(0); } } //需求数量校验 if(Objects.isNull(vo.getConfirmQuantity())){ errMsgList.add("第" + sort + "行,人工需求数量为空!\n"); errorFlag = true; }else{ try{ confirmQuantity = new BigDecimal(vo.getConfirmQuantity()).setScale(3, RoundingMode.HALF_DOWN); }catch (NumberFormatException e){ errMsgList.add("第" + sort + "行,人工需求数量格式错误!\n"); errorFlag = true; } } if(!errorFlag){ prepareDtoMap.compute( vo.getMaterialCode(), (key, existingDto) -> { if (existingDto == null) { // 第一次遇到该 materialCode,创建新对象 ImportPrepareDto newDto = new ImportPrepareDto(); newDto.setMaterial(material); newDto.setWarehouse(warehouse); newDto.setConfirmQuantity(confirmQuantity); return newDto; } else { // 已存在,累加数量 BigDecimal updatedQuantity = existingDto.getConfirmQuantity().add(confirmQuantity); existingDto.setConfirmQuantity(updatedQuantity); return existingDto; } } ); } sort++; }优化这部分代码逻辑
最新发布
09-18
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值