【问题标题】:How do I delete multiple records using REST API如何使用 REST API 删除多条记录
【发布时间】:2021-06-13 08:26:43
【问题描述】:

我是Springboot的新手,我开发了按ID删除记录的资源,现在我喜欢删除选定的多条记录。 示例:我喜欢在单个请求中删除 10 条记录中的 3 条记录

控制器类:

 @ApiHeader(
            apiOperation = "delete a Content Manage by id",
            apiOperationNotes = "delete a Content Manage by id"
    )
    @PostMapping(value = UriConstants.CONTENT_MANAGE_DELETE)
    @ResponseStatus(HttpStatus.OK)
    public void deleteContentManage(@PathVariable("content_manage_id") int contentmanageId) {
        contentManageService.deleteContentManage(contentmanageId);
    }

服务类:

  @Transactional(rollbackFor = Exception.class)
    public void deleteContentManage(int contentmanageId) {
        Optional<UserContentManage> optional = userContentManageRepository.findById(contentmanageId);
        if(!optional.isPresent()){
            log.error("Exception occurs while not found content manage ({}) in deletion. ", contentmanageId);
            throw new GenericBadException(StaffNotificationExceptionEnum.CONTENT_MANAGE_NOT_FOUND_EXCEPTION);
        }
        userContentManageRepository.deleteById(contentmanageId);
    }

JPA 类:

public interface UserContentManageRepository extends JpaRepository<UserContentManage, Integer> {
}

请建议我如何删除选定的多条记录。

【问题讨论】:

  • 获取 POST 请求中的 id 列表,并根据 id 获取所有实体。并根据您的要求进行软删除或硬删除。

标签: arrays spring-boot jpa collections rest


【解决方案1】:

您可以像在存储库中添加方法

@Modifying
@Transactional
@Query("delete from UserContentManagep where u.id in(:integers)")
void deleteByIdIn(List<Integer> integers);

如果你在项目中实现了软删除,你可以像下面这样进行软删除:

@Modifying
@Transactional
@Query("update  UserContentManagep u set u.active = false where u.id in(:integers)")
void softDeleteAllIds(List<Integer> integers);

从服务类你可以尝试调用为

public void deleteAllBYIds(List<Integer> integers) {
    personRepository.deleteByIdIn(integers);
}

完整的工作示例:

@RestController
@RequestMapping("/person")
public class PersonController {

    private final PersonService personService;

    @Autowired
    public PersonController(PersonService personService) {
        this.personService = personService;
    }

    @GetMapping
    public Iterable<Person> list() {
        return personService.list();
    }

    @PostMapping
    public Person create(@RequestBody Person car) {
        return personService.save(car);
    }


    @DeleteMapping
    public String delete(@RequestParam("ids") List<Integer> ids) {
        System.out.println("deleting");
        personService.deleteAllBYIds(ids);
        return String.join(",", ids.stream().map(value ->  Integer.toString(value)).collect(Collectors.toList()));
    }


}

@Getter
@Setter
@ToString
@Entity
@Where(clause = "active = true") // selecting only items which are active
class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String name;
    private boolean active = true;
}

@Service
class PersonService {
    private final PersonRepository personRepository;

    @Autowired
    PersonService(PersonRepository personRepository) {
        this.personRepository = personRepository;
    }

    @Transactional
    public Person save(Person person) {
        return personRepository.save(person);
    }

    @Transactional(readOnly = true)
    public Iterable<Person> list() {
        return personRepository.findAll();
    }

    @Transactional(readOnly = true)
    public PersonDTO findPersonByName(String name) {
        return personRepository.findPersonsByName(name);
    }

    public void deleteAllBYIds(List<Integer> integers) {
//        personRepository.deleteByIdIn(new ArrayList<>(integers));
        personRepository.softDeleteAllIds(integers);

        System.out.println("deleted adnlakdjakldlas");
    }
}

interface PersonDTO {
    String getName();

    Collection<String> getPersonEvents();
}

@Repository
interface PersonRepository extends CrudRepository<Person, Integer> {
    PersonDTO findPersonsByName(String name);

    @Modifying
    @Transactional
    @Query("delete from Person p where p.id in(:integers)")
    void deleteByIdIn(List<Integer> integers);

    @Modifying
    @Transactional
    @Query("update  Person p set p.active = false where p.id in(:integers)")
    void softDeleteAllIds(List<Integer> integers);

}

【讨论】:

    【解决方案2】:

    首先你需要创建一个jpa查询方法,让所有记录都属于id。

    public interface UserContentManageRepository extends JpaRepository<UserContentManage, Integer> {
           List<UserContentManage> findAllById(Integer id);  
    }
    

    之后就可以对 List 进行 deleteAll() 操作了。

    @Transactional(rollbackFor = Exception.class)
    public void deleteContentManage(int contentmanageId) {
    
        List<UserContentManage> userContentManageList = userContentManageRepository.findAllById(contentmanageId);
        if(userContentManageList == null){
            log.error("Exception occurs while not found content manage ({}) in deletion. ");
            throw new GenericBadException(StaffNotificationExceptionEnum.CONTENT_MANAGE_NOT_FOUND_EXCEPTION);
        }
    
        userContentManageRepository.deleteAll(userContentManageList );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-04
      • 2014-05-06
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      • 2020-03-04
      • 2020-09-11
      • 1970-01-01
      相关资源
      最近更新 更多