【问题标题】:how to change a lot of data in Spring Boot Restful (Update Multiple data)如何在 Spring Boot Restful 中更改大量数据(更新多个数据)
【发布时间】:2020-03-08 23:10:15
【问题描述】:
[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);                      
}

【问题讨论】:

  • 使用@PatchMapping

标签: java rest api spring-boot web-services


【解决方案1】:
【解决方案2】:

如果您想完全更新您的资源,请使用@PutMapping 部分更新,请使用@PatchMapping。供参考检查here

【讨论】:

    【解决方案3】:

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

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

    但要小心创建的堆大小 - 所有对象都可能非常重。
    请注意that question - List 上传递的对象将不会被验证,因此您可以遵循这些答案。

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

    【讨论】:

      【解决方案4】:

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

      但据我了解,empId 是employeeId。 Employee 本身与 RoomStatus 具有一对多的关系。您的方法采用employeeId 和roomStatusDetails,并且对于与employeeId 关联的每个RoomStatus,您要设置roomStatusDetails。在这种情况下,您可以执行以下操作。 首先,在你的 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);
      }
      

      【讨论】:

        猜你喜欢
        • 2019-06-15
        • 1970-01-01
        • 1970-01-01
        • 2020-02-04
        • 2021-07-05
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        • 2023-03-16
        相关资源
        最近更新 更多