如何使用 spring 引导在数据库中找到现有对象 ID?

How would I find the existing objects id in the database using spring boot?

该应用程序有 2 个功能,我可以在其中创建一个新的脚本文件,还可以编辑现有的脚本文件。我对创建和编辑的逻辑基本上是相同的,唯一的主要区别是编辑而不是创建新脚本,我将必须找到现有脚本并覆盖它。我不确定我应该如何在 spring boot.

中通过 id 找到脚本

这是我的创建脚本功能:

控制器Class:

@Controller
@RequestMapping("/api/auth/")
public class TestServerController {
   @Autowired
   ScriptsRepository scriptsRepository;
   @Autowired
   LineItemRepository lineItemRepository;
   @Autowired
   LineItemDataRepository lineItemDataRepository;
  public TestServerController() {

  }
   @CrossOrigin(origins = "*")
   @RequestMapping(value = "createScript")
   public ResponseEntity<?> createScript(@RequestBody String body, @RequestParam String name) throws Exception {


      JSONArray script = new JSONArray(body);
      Scripts new_script = new Scripts(name);


      scriptsRepository.save(new_script);
      for (int i = 0;i<script.length();i++) {

         JSONObject current_line_item = (JSONObject) script.get(i);

         if(!current_line_item.has("keyword")  ){
            return ResponseEntity
                  .badRequest()
                  .body(new MessageResponse("Invalid Json Object"));
         }
         String keyword = current_line_item.getString("keyword");
         LineItem new_li = new LineItem(keyword,i);
         new_li.setSid(new_script);

         lineItemRepository.save(new_li);

         int order = 0;
         var keys = current_line_item.keys();
         for (Iterator<String> it = keys; it.hasNext(); ) {
            var key = it.next();
            if(key.equals("keyword")){
               continue;
            }
            var value = current_line_item.getString(key);
            // we will need to do something about this if the column values arent strings

            LineItemData vb = new LineItemData(key,value,order);
            vb.setLid(new_li);
            lineItemDataRepository.save(vb);
            order++;

         }

      }

      return ResponseEntity.ok(new MessageResponse("Script Uploaded Successfully"));
   }

对于编辑脚本,我想删除 Scripts new_script = new Scripts(name); 并使用 findbyId 在数据库中查找脚本并将其传递到 scriptsRepository.save(new_script); 而不是 new_script,我只需要使用 id 的脚本文件。这对我没有用,我遇到了错误。还有其他方法吗?

当您使用 scriptsRepository.save(script) 时,它会将脚本保存在您的数据库中。但是,如果您在数据库中已有一个脚本,其 ID 与您通过参数传递的脚本的 ID 相同,则它不会创建一个新脚本,而只是使用您要保存的脚本的信息更新它。

遵循 REST API 设计的脚本控制器(仅使用更新方法)将是这样的:

@RestController
@RequestMapping("/scripts")
public class ScriptController {

    @Autowired
    ScriptRepository scriptRepository;

    @PutMapping("/{id}")
    @ResponseStatus(HttpStatus.OK)
    public Script update(@RequestBody Script script, @PathVariable long id) {

        if (scriptRepository.findById(id).isEmpty()) {
            throw new RecordNotFoundException();
        }
        script.setId(id);
        return scriptRepository.save(script);
    }
}

要访问它,您需要使用端点 localhost:8080/scripts/{id}(如果您使用默认 Spring Boot localhost:8080).

您不需要抛出异常,但如果您需要,您需要像这样创建一个简单的 class:

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(HttpStatus.NOT_FOUND)
public class RecordNotFoundException extends RuntimeException {

}