Spring jpa pagination как сквозная задача - как добавить общее количество страниц, общее количество элементов в исходный запрос? - PullRequest
0 голосов
/ 16 июня 2019

Как реализовать пейджинг как сквозную задачу, не возвращая много полей, которые мне не нужны в ответе?По сути, я хочу только вернуть список объектов вида + поля «Всего элементов» и «Всего страниц».

Вот как мой код в настоящее время настроен, он должен быть довольно простым: playerController используетplayerService для запроса playerEntities из playerRepository.PlayerService извлекает их из playerRepository, преобразует их в Player POJO и возвращает их.Наконец, pojos снова преобразуются в playerViews.

Я использую POJO, потому что я не хочу возвращать целые сущности из сервиса.Я использую представления в основном по той же причине - я не хочу возвращать больше полей, чем мне нужно.Кроме того, я чувствую, что обслуживание, и взгляды не должны иметь ничего общего с друг другом.Я ошибся?Pojo и view в настоящее время имеют только два одинаковых поля, так что, возможно, некоторые из них излишни.

В любом случае - я хочу, чтобы ответ контроллера содержал поле общего количества страниц.Но я не хочу добавлять такое поле вручную к каждому вызову нумерации страниц, который я собираюсь реализовать.Я попытался вернуть список объектов PageImpl вместо List, который действительно дает мне правильные поля, но в результате получается много дополнительного кода и много дополнительных полей - именно то, чего я пытался избежать.Должен быть лучший, более обобщенный способ?

@RestController
@RequestMapping(value = "/players")
public class PlayerController {

    @Autowired
    PlayerService playerService;

    @Autowired
    PlayerViewFactory playerViewFactory;

    @GetMapping
    public List<PlayerView> getPlayers(@RequestParam String q, @RequestParam int page, @RequestParam int pageSize) throws IOException {

       return playerService.getPlayers(q, PageRequest.of(page,pageSize))
               .stream()
               .map(pl -> playerViewFactory.create(pl.getId(), pl.getName()))
               .collect(Collectors.toList());
    }
}




@Service
public class PlayerService {

    @Autowired
    PlayerRepository playerRepository;

    public List<Player> getPlayers(String q, Pageable p) {

       return playerRepository.findByName(q,p)
               .stream()
               .map(pl -> toPlayer(pl.getId(), pl.getName()))
               .collect(Collectors.toList());
    }

    private Player toPlayer(int id, String name) {
        return new Player(id,name);
    }
}

public interface PlayerRepository extends JpaRepository<PlayerEntity, Integer> {
    @Query("SELECT p FROM PlayerEntity p WHERE p.name LIKE ?1")
    List<PlayerEntity> findByName(String s, Pageable p);
}

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Player {
    private int id;
    private String name;
}

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class PlayerView {
    private int id;
    private String name;
}

@Component
public class PlayerViewFactory {
    public PlayerView create(int id, String name) {
        return new PlayerView(id,name);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...