【问题标题】:How do I delete multiple records using REST API in Hibernate如何在 Hibernate 中使用 REST API 删除多条记录
【发布时间】:2021-06-23 10:10:10
【问题描述】:

您好,我是 Spring Boot 新手,我已经开发了 API 来通过 ID 获取、创建和删除单个记录,现在我想发出删除选定的多个记录的请求。示例:我喜欢在单个请求中删除 10 条记录中的 4 条记录,而不是发出 4 条删除请求。

ProjectController.java

@Qualifier("projectServiceImpl")
@Autowired
private ProjectService projectService;

@Autowired
private MapValidationErrorService mapValidationErrorService;

@PostMapping("")
public ResponseEntity<?> createNewProject(@Valid @RequestBody Project project, BindingResult result){

    ResponseEntity<?> errorMap = mapValidationErrorService.MapValidationService(result);
    if(errorMap!=null) return errorMap;

    Project project1 = projectService.saveOrUpdateProject(project);
    return new ResponseEntity<Project>(project1, HttpStatus.CREATED);
}

@GetMapping("/{id}")
public ResponseEntity<?> findProjectById(@PathVariable Long id){
    Project project = projectService.findProjectById(id);
    return new ResponseEntity<Project>(project, HttpStatus.OK);
}

@GetMapping("")
public List<Project> getAllProjects(){return projectService.findAllProjects();}

@DeleteMapping("/{id}")
public ResponseEntity<?> deleteProject(@PathVariable Long id){
    projectService.deleteProjectById(id);

    return new ResponseEntity<String>("Project with id: '"+id+ "' was deleted", HttpStatus.OK);
}

ProjectServiceImpl.java

@Autowired
private ProjectRepository projectRepository;

@Override
public long count() {
    return projectRepository.count();
}

public Project saveOrUpdateProject(Project project){
    try{
        project.setProjectNumber(project.getProjectNumber());
        return projectRepository.save(project);
    }catch (Exception e){
        throw new ProjectNumberException("The project number "+project.getProjectNumber()+" is already existed. Please select a different project number.");
    }
}

public Project findProjectById(Long id) {
    return projectRepository.findById(id).orElse(null);
}

public List<Project> findAllProjects() {
    return projectRepository.findAll();
}

public void deleteProjectById(Long id) {
    Project project = projectRepository.findById(id).orElse(null);;
    projectRepository.delete(project);
}

ProjectRepository.java

@Repository
public interface ProjectRepository extends JpaRepository<Project, Long>, QuerydslPredicateExecutor<Project> {}

【问题讨论】:

    标签: java spring spring-boot hibernate spring-data-jpa


    【解决方案1】:

    你可以在ProjectRepository中添加这样的方法

    @Modifying
    @Query("delete from Project where id in (:ids)")
    int deleteByIds(@Param("ids") List<Long> ids);
    

    你需要一个端点来处理这样的 JSON 请求

    {
      "ids" : [1, 2, 3]
    }
    

    【讨论】:

    • 你能把Service和Controller层的方法也给我吗?我仍然感到困惑。
    • 例如,我希望我的删除请求参数像 /id=2&id=4&id=5 我应该怎么做?我是前端开发人员,所以我不能很好地理解这些东西。
    • @jakeywang 您可以在 Spring 中使用这样的多个参数,但最好在请求正文中传递带有 ids 的 JSON,就像使用 POST 请求一样。
    • 确保也添加@Transactional。避免并发问题
    • @DeepanshuRathi @Transactional 不会帮助解决并发问题。而且这里不需要——基础仓库有这个注解。
    【解决方案2】:

    我有类似的问题。以下解决方案解决了我的问题:

    ProjectController.java:

    @PostMapping("/")
    public ResponseEntity<?> deleteProject(@RequestBody Long[] ids){
    projectService.deleteProjectById(ids);
    
    return new ResponseEntity<String>("Project with ids: '"+ids+ "' was deleted", 
    HttpStatus.OK);
    } 
    

    ProjectServiceImpl.java

    public void deleteProjectById(Long[] ids) {
      for (Long id : ids) {
      Project project = projectRepository.findById(id).orElse(null);
      projectRepository.delete(project);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-13
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 2014-05-06
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      相关资源
      最近更新 更多