如何在Spring Boot Restful(更新多个数据)中更改大量数据


[I want this function to work, i.e. change a lot of data at once][1]

我想一次更改很多数据,如何更改?

在这个DAO下只更改一个数据,如果我想更改很多呢

@PutMapping("/roomstatus/update/{id}")
public ResponseEntity<RoomStatus> updatRoomStatus(@PathVariable(value="id") Integer empid,@Valid @RequestBody RoomStatus RsDetails){
RoomStatus emp=roomStatusDAO.findOne(empid);
if(emp==null) {
return ResponseEntity.notFound().build();
}
emp.setRoomNumber(RsDetails.getRoomNumber());
emp.setFloor(RsDetails.getFloor());
emp.setGuestName(RsDetails.getGuestName());
emp.setRoomType(RsDetails.getRoomType());
emp.setBedType(RsDetails.getBedType());
emp.setRoomStatus(RsDetails.getRoomStatus());
emp.setConditions(RsDetails.getConditions());
RoomStatus updateRoomStatus=roomStatusDAO.save(emp);
return ResponseEntity.ok().body(updateRoomStatus);                      
}

使用ModelMapper可以更改很多数据检查链接

https://www.appsdeveloperblog.com/java-objects-mapping-with-modelmapper/

https://www.baeldung.com/entity-to-and-from-dto-for-a-java-spring-application

最简单的解决方案是作为@RequestBodyRoomStatus集合传递。

@PatchMapping("/roomstatus/update")
public ResponseEntity<RoomStatus> updatRoomsStatus(@Valid @RequestBody List<RoomStatus> rsDetails){
List<RoomStatus> updated = rsDetails.stream().map(rs -> updateRoomStatus(rs)).collect(Collectors.toList());
return ResponseEntity.ok().body(updated);
}
private RoomStatus updateRoomStatus(RoomStatus emp) {
if(emp==null) {
return ResponseEntity.notFound().build();
}
emp.setRoomNumber(RsDetails.getRoomNumber());
emp.setFloor(RsDetails.getFloor());
emp.setGuestName(RsDetails.getGuestName());
emp.setRoomType(RsDetails.getRoomType());
emp.setBedType(RsDetails.getBedType());
emp.setRoomStatus(RsDetails.getRoomStatus());
emp.setConditions(RsDetails.getConditions());
return roomStatusDAO.save(emp);
}

但是要小心创建的堆大小——所有的对象都可能非常重
请注意,列表中的问题传递对象将不会被验证,因此您可以按照这些答案进行操作。

PS如果每个对象的修改都是一样的,只需要RequestBody中的自定义对象,该对象包含一个od ID和修改列表。然后从spring数据中调用自定义JPQL查询,该查询只调用DB一次,而不是进行n次调用。

如果您想完全更新您的资源,请使用@PutMapping进行部分更新,并使用@PatchMapping。请在此处查看以供参考。

首先,你的问题不够具体,表述得不够好。

但据我所知,empId就是employeeId。员工本身与RoomStatus具有一对多关系。您的方法采用employeeId和roomStatusDetails,对于与employe_Id关联的每个RoomStatus,您需要设置RoomStatus Details。在这种情况下,您可以执行以下操作。首先,在roomStatusDAO接口中添加一个方法,通过empId:findAllByEmpId(Integer empId)获取RoomStatus的集合,并在相应的类中提供其实现。然后,解决方案将是这样的:

@PutMapping("/roomstatus/update/{id}")
public ResponseEntity<RoomStatus> updatRoomStatus(@PathVariable(value="id") Integer empid,@Valid @RequestBody RoomStatus RsDetails){    
List<RoomStatus> updatedRoomStatuses = roomStatusDAO.findAllByEmpId(empid).stream().map(rs -> setRsDetailsAndSave(rs, RsDetails)).collect(Collectors.toList());
return updatedRoomStatuses.isEmpty() ? ResponseEntity.notFound().build() : ResponseEntity.ok().body(updatedRoomStatus);                   
}
private RoomStatus setRsDetailsAndSave (RoomStatus rs, RoomStatus RsDetails) {
rs.setRoomNumber(RsDetails.getRoomNumber());
rs.setFloor(RsDetails.getFloor());
rs.setGuestName(RsDetails.getGuestName());
rs.setRoomType(RsDetails.getRoomType());
rs.setBedType(RsDetails.getBedType());
rs.setRoomStatus(RsDetails.getRoomStatus());
rs.setConditions(RsDetails.getConditions());
return roomStatusDAO.save(rs);
}

最新更新