我有一個表Product包括大約 5 列:upc、product_name、brand、category、price,upc是唯一值,我將其設定為Primary Key。
現在我想更新基于upc的任何特定列,我已經完成了,但它總是要求將所有列變數放入RequestBody雖然我只想更新一列。
例如,我想productName從Nivea更新到Dove,我必須使用這個長 RequestBody:
{
"upc": "100101101111",
"productName" : "Dove",
"brand": "Procter & Gamble",
"category" : "Bath and Body",
"description": "Shampoo"
}
如果我錯過了RequestBody中的一個鍵,我會得到錯誤代碼500。如果我只能放置 2 列是否有可能:upc用于我要更新的特定產品,另一列具有我要更新的值?
例如,我想將 productName 從Nivea更新為Dove,我該怎么做:
{
"upc": "100101101111",
"productName" : "Dove",
}
她是我的updateProduct功能:
@Override
public Status updateProduct(Product product) {
List<Product> products = productRepository.findAll();
for (Product prod : products) {
if (prod.getUpc().equals(product.getUpc())) {
productRepository.save(product);
return Status.SUCCESS;
}
}
return Status.PRODUCT_NOT_FOUND;
}
我的controller:
@PutMapping("/updateproduct")
public ResponseEntity<String> updateProduct(String upc, @RequestBody Product product) {
Status stt = productService.updateProduct(product);
if (stt == Status.SUCCESS) {
return ResponseEntity.status(HttpStatus.OK).body("Product Updated Successfully!");
}
else if (stt == Status.PRODUCT_NOT_FOUND) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Product with upc = " product.getUpc() " Not Found!");
}
else {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
}
uj5u.com熱心網友回復:
首先,沒有必要執行findAll查詢,因為您的upc欄位是唯一的,您將提取所有記錄以獲取潛在的海量表。現在,這是一種實作您想要實作的目標的潛在方法:
@Override
public Status updateProduct(Product product) {
Product prod = productRepository.findByUpc(product.getUpc());
if (product.getProductName() != null && !Objects.equals(prod.getProductName(), product.getProductName())) {
prod.setProductName(product.getProductName());
productRepository.save(prod);
}
return Status.SUCCESS;
}
您可以添加多個 if 檢查并將邏輯調整到您希望用戶能夠更新的欄位。通過這種方式,您可以從資料庫中獲取物體,并且只修改請求包含的欄位。
請注意,如果您對要更新的內容使用此約定,您將無法將某些內容設定為 null。DTO在您的請求中使用物件而不是相同的物體類也會很好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/514371.html
標籤:弹簧靴休息放
