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);
}
}
/*
该代码作者:大明哥
*/
本文探讨了在Java中如何安全地从一个表中删除记录,特别是当这些记录与另一个表有关联时。通过示例代码说明了一种有效的方法来避免删除已被其他表中的记录引用的数据。
2228

被折叠的 条评论
为什么被折叠?



