如何在控制器上用JavaSpringJPA进行批量更新
以下是我仅更改一个数据的方法如何在控制器上用JavaSpringJPA进行批量更新,java,spring,spring-boot,spring-mvc,spring-data-jpa,Java,Spring,Spring Boot,Spring Mvc,Spring Data Jpa,以下是我仅更改一个数据的方法 @RequestMapping(value = "/updateroomstatus", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) public Response<SaveResponse> updateRoomStatus(@RequestBody Request<RoomDetail> request, HttpSer
@RequestMapping(value = "/updateroomstatus", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public Response<SaveResponse> updateRoomStatus(@RequestBody Request<RoomDetail> request, HttpServletRequest httpServletRequest) throws ParseException, JsonProcessingException {
Response<SaveResponse> rvalue = new Response<>();
Status status = new Status();
String user = request.getSession().getUserId();
log.info("Headers : " + HttpUtil.getHeadersInfo(httpServletRequest).toString());
log.info("Incoming request from " + httpServletRequest.getRemoteAddr() + ":" + httpServletRequest.getRemotePort() + "\n"
+ " Method : " + httpServletRequest.getMethod() + "\n"
+ " TLS : " + httpServletRequest.isSecure() + "\n"
+ " Path : " + httpServletRequest.getRequestURI() + "\n"
+ " Body : " + mapper.writeValueAsString(request));
RoomDetail updatedData = request.getPayload();
Optional<RoomDetail> getData = roomDetailRepository.findById(updatedData.getId());
if(getData.isPresent()) {
RoomDetail oldData = getData.get();
//just one data can update
oldData.setStatus(updatedData.getStatus());
oldData.setDescription(updatedData.getDescription());
roomDetailRepository.saveAndFlush(oldData);
status.setStatusCode("000");
status.setStatusDesc("Success");
} else {
status.setStatusCode("001");
status.setStatusDesc("Data Not Found");
}
log.info("Resp : " + status.toString());
rvalue.setStatus(status);
return rvalue;
}
我想做的是批量更新,这会改变很多数据。看起来是这样的
[
{
"id": 91,
"description": "Very Good",
"status": "Occupied"
},
{
"id": 93,
"description": "Normal",
"status": "Vacant Dirty"
},
{
"id": 98,
"description": "Not bad",
"status": "Occupie Dirty"
}
]
我得到的信息是,批量更新是通过添加数组和循环来完成的。有人能帮忙吗?我想让你做的是创建一个BulkRoomDetail类,在该类中包括一个名为“rooms”的RoomDetail列表字段。之后,将您的
请求
替换为请求
。要改变这一点,您必须这样请求:
{
"rooms": [
{
"id": 91,
"description": "Very Good",
"status": "Occupied"
},
{
"id": 93,
"description": "Normal",
"status": "Vacant Dirty"
},
{
"id": 98,
"description": "Not bad",
"status": "Occupie Dirty"
}
]
}
您的代码将接近于此:
@RequestMapping(value = "/updateroomstatus", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public Response<SaveResponse> updateRoomStatus(@RequestBody Request<BulkRoomDetail> request,
HttpServletRequest httpServletRequest) throws ParseException, JsonProcessingException {
Response<SaveResponse> rvalue = new Response<>();
Status status = new Status();
String user = request.getSession().getUserId();
log.info("Headers : " + HttpUtil.getHeadersInfo(httpServletRequest).toString());
log.info("Incoming request from " + httpServletRequest.getRemoteAddr() + ":"
+ httpServletRequest.getRemotePort() + "\n" + " Method : " + httpServletRequest.getMethod() + "\n"
+ " TLS : " + httpServletRequest.isSecure() + "\n" + " Path : "
+ httpServletRequest.getRequestURI() + "\n" + " Body : " + mapper.writeValueAsString(request));
BulkRoomDetail bulkOfRooms = request.getPayload();
List<RoomDetail> rooms = bulkOfRooms.getRooms();
BulkRoomDetail newUpdatedBulkResponse = new BulkRoomDetail();
rooms.forEach(room -> newUpdatedBulkResponse.getRooms().add(updateRoom(room)));
rvalue.setBulk(newUpdatedBulkResponse); // dont know what rvalue is :/
return rvalue;
}
private RoomDetail updateRoom(RoomDetail room) {
Optional<RoomDetail> getData = roomDetailRepository.findById(room.getId());
if (getData.isPresent()) {
RoomDetail oldData = getData.get();
// just one data can update
oldData.setStatus(room.getStatus());
oldData.setDescription(room.getDescription());
return roomDetailRepository.saveAndFlush(oldData);
}
room.setStatus("001");
room.setDescription("Data Not Found");
return room;
}
}
@RequestMapping(value=“/updateroomstatus”,method=RequestMethod.POST,consumes=MediaType.APPLICATION\u JSON\u value)
公共响应更新omstatus(@RequestBody Request,
HttpServletRequest(HttpServletRequest)引发ParseException、JsonProcessingException{
Response rvalue=新响应();
状态=新状态();
字符串user=request.getSession().getUserId();
log.info(“Headers:+HttpUtil.getHeadersInfo(httpServletRequest.toString());
log.info(“来自“+httpServletRequest.getRemoteAddr()+”的传入请求:”
+httpServletRequest.getRemotePort()+“\n”+”方法:“+httpServletRequest.getMethod()+”\n”
+TLS:“+httpServletRequest.IsSecurity()+”\n“+”路径:
+httpServletRequest.getRequestURI()+“\n”+”正文:“+mapper.writeValueAsString(请求));
BulkRoomDetail bulkOfRooms=request.getPayload();
List rooms=bulkOfRooms.getRooms();
BulkRoomDetail newUpdatedBulkResponse=新BulkRoomDetail();
rooms.forEach(room->newUpdatedBulkResponse.getRooms().add(updateeRoom(room));
rvalue.setBulk(newUpdatedBulkResponse);//不知道rvalue是什么:/
返回右值;
}
私人房间详细信息更新eRoom(房间详细信息室){
可选的getData=roomDetailRepository.findById(room.getId());
if(getData.isPresent()){
RoomDetail oldData=getData.get();
//只有一个数据可以更新
oldData.setStatus(room.getStatus());
setDescription(room.getDescription());
return roomDetailRepository.saveAndFlush(旧数据);
}
setStatus房间(“001”);
房间设置说明(“未找到数据”);
返回室;
}
}
**还没测试好吗?!?:) 更改可以接受房间详细信息列表的请求主体。迭代它,同样的代码应该可以工作
@RequestMapping(value = "/updateroomstatus", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public Response<List<SaveResponse>> updateRoomStatus(@RequestBody List<RoomDetail> roomDetails){
List<SaveResponse> responses = new ArrayList<>();
for(RoomDetail roomDetail : roomDetails){
Optional<RoomDetail> getData = roomDetailRepository.findById(roomDetail.getId());
if(getData.isPresent()) {
RoomDetail oldData = getData.get();
//just one data can update
oldData.setStatus(updatedData.getStatus());
oldData.setDescription(updatedData.getDescription());
roomDetailRepository.saveAndFlush(oldData);
status.setStatusCode("000");
status.setStatusDesc("Success");
} else {
status.setStatusCode("001");
status.setStatusDesc("Data Not Found");
}
log.info("Resp : " + status.toString());
rvalue.setStatus(status);
responses.add(rvalue);
}
return responses;
@RequestMapping(value=“/updateroomstatus”,method=RequestMethod.POST,consumes=MediaType.APPLICATION\u JSON\u value)
公共响应更新omstatus(@RequestBody List roomDetails){
列表响应=新建ArrayList();
用于(RoomDetail RoomDetail:roomDetails){
可选的getData=roomDetailRepository.findById(roomDetail.getId());
if(getData.isPresent()){
RoomDetail oldData=getData.get();
//只有一个数据可以更新
setStatus(updateData.getStatus());
setDescription(updateData.getDescription());
roomDetailRepository.saveAndFlush(旧数据);
状态。设置状态代码(“000”);
状态。设置状态USDESC(“成功”);
}否则{
状态。设置状态代码(“001”);
status.setStatusDesc(“未找到数据”);
}
log.info(“Resp:+status.toString());
右值设置状态(状态);
回答。添加(右值);
}
回应;
请检查此链接,先生,谢谢您的意见,但sory没有工作:)@RikoIkoJanuar很抱歉:(.但是,如果你想要一个100%的功能代码,你可以复制并通过,我认为你不会找到。上面的代码是一个基于数组和循环的想法。看起来不错…方括号可能是额外的/更少的。请小心
@RequestMapping(value = "/updateroomstatus", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public Response<List<SaveResponse>> updateRoomStatus(@RequestBody List<RoomDetail> roomDetails){
List<SaveResponse> responses = new ArrayList<>();
for(RoomDetail roomDetail : roomDetails){
Optional<RoomDetail> getData = roomDetailRepository.findById(roomDetail.getId());
if(getData.isPresent()) {
RoomDetail oldData = getData.get();
//just one data can update
oldData.setStatus(updatedData.getStatus());
oldData.setDescription(updatedData.getDescription());
roomDetailRepository.saveAndFlush(oldData);
status.setStatusCode("000");
status.setStatusDesc("Success");
} else {
status.setStatusCode("001");
status.setStatusDesc("Data Not Found");
}
log.info("Resp : " + status.toString());
rvalue.setStatus(status);
responses.add(rvalue);
}
return responses;