如何在控制器上用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;