2

Below is my way to change just one data

    @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;
}

When making a request using Postman, it will be like this. And this works well

        {
        "id": 91,
        "description": "normal",
        "status": "Occupied"
        }

What I want is to do a bulk update, which is changing a lot of data. And it looks like this

     [
        {
        "id": 91,
        "description": "Very Good",
        "status": "Occupied"
        },
        {
        "id": 93,
        "description": "Normal",
        "status": "Vacant Dirty"
        },

        {
        "id": 98,
        "description": "Not bad",
        "status": "Occupie Dirty"   
        }
    ]

I got information that doing bulk updates is by adding arrays and looping. Can anyone help?

Jhon Smith
  • 93
  • 12
  • 1
    Please check this https://stackoverflow.com/questions/50772230/how-to-do-bulk-multi-row-inserts-with-jparepository – VKJava Nov 20 '19 at 02:36

2 Answers2

2

change your request body which can accept list of RoomDetails. Iterate it and same code should work

    @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;
Swarit Agarwal
  • 2,520
  • 1
  • 26
  • 33
1

What i sujest you to do, is create a BulkRoomDetail class, and inside that class include a list field of RoomDetail named 'rooms' for example. After that, replace your Request<RoomDetail> to Request<BulkRoomDetail>. Changing that, you will have to request like that:

{
    "rooms": [
        {
        "id": 91,
        "description": "Very Good",
        "status": "Occupied"
        },
        {
        "id": 93,
        "description": "Normal",
        "status": "Vacant Dirty"
        },

        {
        "id": 98,
        "description": "Not bad",
        "status": "Occupie Dirty"   
        }
    ]
}

Your code would be close to this:

    @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;
    }

}

** haven't tested ok?!? :)

  • Oke sir, thanks for your opinion, but sory is not work :) – Jhon Smith Nov 20 '19 at 03:56
  • @RikoIkoJanuar sorry about that :(. But if you want a 100% functional code that you can copy and past, i don't think you will find that. The code above is an ideia for what you have to do based on arrays and loops. Good look – Otávio Augusto Junior Nov 20 '19 at 04:09