java中两个关联数据表,如何根据关联字段判断其中是否存有关联数据
1.写在前面
这几天项目有个问题,就是在车辆列表中删除车辆时,如果这个车辆被驾驶员列表里的驾驶员绑定了,就不能删除这个车辆,一开始不知道咋弄,还想着在车辆列表弄个status字段,每次驾驶员绑定车辆时就给该车辆的状态设为1,解除绑定就设为0,但后来发现有个大问题,就是如果一个车绑定两个司机,其中一个司机解绑了,但另一个没有,这就存在问题了。
2.解决办法
一开始我用的方法是,先判断车辆表DTO里的id和驾驶员表里的vehicle_id有没有一样的,有就不执行删除,直接粗暴的阻止一切删除。
@SysLog("删除车辆")
@DeleteMapping("/{id}")
@Transactional
public R removeById(@PathVariable Integer id, @RequestBody CdDriverInfo driverInfo) {
CdVehicleInfo cdVehicleInfo = vehicleInfoService.getOne(new QueryWrapper<CdVehicleInfo>().eq("id", driverInfo.getVehicleId()));
if (cdVehicleInfo == null){
vehicleInfoService.removeById(id);
fileInfoService.remove(Wrappers.<CommonFileInfo>lambdaQuery().eq(CommonFileInfo::getRefId, id));
}
return R.ok();
}
其实这个写的有很大问题,结果应该是找不到
3.请教大佬
@SysLog("删除车辆(批量)")
@DeleteMapping("/batch")
@Transactional
public R removeByIds(@RequestBody List<Integer> ids,CdDriverInfo driverInfo) {
//Integer型数组ids遍历赋值给id
for (Integer id : ids) {
//查询单个车辆id是否被驾驶员绑定,可能查出多个数据故用list接受返回数据
List<CdDriverInfo> cdDriverInfos = driverInfoService.list(new QueryWrapper<CdDriverInfo>().eq("vehicle_id", id));
//判断list是否为空
if (cdDriverInfos!=null&&!cdDriverInfos.isEmpty()){
//list不为空代表车辆被绑定,无法删除
//从ids中刪除本id
ids.remove(id);
return R.failed("数据已关联不能删除");
}
}
vehicleInfoService.removeByIds(ids);
fileInfoService.remove(Wrappers.<CommonFileInfo>lambdaQuery().in(CommonFileInfo::getRefId, ids));
return R.ok();
}
}
请教大佬之后,大佬给出的方法就是遍历传入所有车辆id数据,一个个筛选是否和驾驶员中vehicle_id是否一样,所有的一样的用list集合存放,然后从要删除的ids中去掉这个list,再执行删除。
核心筛选代码(可做模板套用)
/*
该代码作者:大明哥
*/
for (Integer id : ids) {
//查询单个车辆id是否被驾驶员绑定,可能查出多个数据故用list接受返回数据
List<CdDriverInfo> cdDriverInfos = driverInfoService.list(new QueryWrapper<CdDriverInfo>().eq("vehicle_id", id));
//判断list是否为空
if (cdDriverInfos!=null&&!cdDriverInfos.isEmpty()){
//list不为空代表车辆被绑定,无法删除
//从ids中刪除本id
ids.remove(id);
}
}
/*
该代码作者:大明哥
*/