Отображение конечных точек контроллера на уровень Spring JPA - PullRequest
0 голосов
/ 05 апреля 2020

Я написал это сопоставление запроса для доступа к тикету по его идентификатору с необязательными параметрами запроса ticketType & ticketStatus:

@GetMapping(path = "/tickets/{ticketId}")
   @ResponseStatus(value = HttpStatus.OK)
    public ResponseEntity<List<TicketResponse>> getTicketsById(@PathVariable("ticketId") final Long ticketId, @RequestParam("ticketType") final String ticketType, @RequestParam("ticketStatus") final String ticketStatus)

В настоящее время хранилище содержит методы для возврата, основанные либо на ticketId, либо на ticketState. :

    @Repository
    public interface TicketRepository extends JpaRepository<TicketEntity, Long> {

Stream<TicketEntity> findByTicketIdAndTicketState(@Param("ticketId") Long ticketId);

Stream<TicketEntity> findByTicketIdAndTicketState(@Param("ticketId") Long ticketId, @Param("ticketState") String ticketState);

    }

Как эти конечные точки должны отображаться на уровне контроллера?

В настоящее время конечная точка:

@GetMapping(path = "/{ticketId}")
    @ResponseStatus(value = HttpStatus.OK)
    public ResponseEntity<List<TicketResponse>> getTicketsByTicketId(
            @PathVariable("productId") final Long ticketId, @RequestParam(name = "ticketState", required=false) final String ticketState) {

        final List<TicketResponse> ticketsByTicketId = ticketService.getTicketsByTicketId(ticketId);

        if(ticketsByTicketId.size() == 0){
            return ResponseEntity.ok("No tickets found");
        }
        else {
            return ResponseEntity.ok(ticketsByTicketId);
        }

    }

Должна ли я добавить новую конечную точку? :

Или обновить контроллер, чтобы выбрать, какой метод репозитория JPA реализовать в зависимости от запроса?:

@GetMapping(path = "/{ticketId}")
    @ResponseStatus(value = HttpStatus.OK)
    public ResponseEntity<List<TicketResponse>> getTicketsByTicketId(
            @PathVariable("productId") final Long ticketId, @RequestParam(name = "ticketState", required=false) final String ticketState) {

List<TicketResponse> tickets = null;

if(ticketState == null) {
        tickets = ticketService.getTicketsByTicketId(ticketId);
}
else{
tickets = ticketService.getTicketsByTicketIdAndTicketState(ticketId, ticketState);
}

        if(ticketsByTicketId.size() == 0){
            return ResponseEntity.ok("No tickets found");
        }
        else {
            return ResponseEntity.ok(ticketsByTicketId);
        }

    }

Репозиторий JPA будет расширен для фильтрации на основе многих других параметров, таких как ticketType, ticketDescription. Я просто упоминаю об этом, так как логика моего контроллера c станет очень сложной, если потребуется проверить, какой параметр имеет значение null, и выбрать соответствующий запрос JPA.

1 Ответ

0 голосов
/ 05 апреля 2020

Используя Spring Data JPA Specification, эта проблема фильтрации карты может быть решена. Сложные запросы могут быть построены с использованием Criteria API в зависимости от параметра фильтрации.

Хорошая статья о спецификации JPA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...