Страничные запросы в JPA

200
23 февраля 2022, 06:10

вывожу данные из базы подобным образом:

  @GetMapping()
public List<DAOUser> findAll(){
   return userRepository.findAll();
}

Как мне вывести только 10 пользоватлей, начиная с 5й записи?

Answer 1

Я так понимаю вопрос из области пагинации. Так вот есть два стула:

  1. Программная пагинация
  2. Пагинация на уровне базы

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

Второй случай предполагает что у вас к базе будут идти запросы только N нужных вам строк, что конечно перенесет нагрузку на уровень БД. Однако в этом случае требуется написание запросов под конкретную БД. Если вы используете Spring Data то вы можете воспользоваться данным примером.

Answer 2

Для страничного запроса следует добавить специальный метод в твой репозиторий, где есть параметр с типом Pageable. Этот метод должен возвращать объект с типом Page. К примеру это будет выглядеть так:

interface MyRepository extends JpaRepository<DAOUser, Long> {
    Page<DAOUser> findAll(Pageable);
}

Вызов будет примерно такой:

PageRequest pageRequest = PageRequest.of(page, size);
Page<DAOUser> result = userRepository.findAll(pageRequest);

Конкретно для указанного случая уже реализован специальный интерфейс PagingAndSortingRepository, где есть данный метод.

READ ALSO
Записывать звук с микрофона в фоне Java(Android)

Записывать звук с микрофона в фоне Java(Android)

Мне нужно сделать запись звука с микрофона (маленькие фрагменты ~1с) и конвертировать его в stringтакже нужно сделать это в фоне и зациклить чтобы...

112
Отключить редактирование jTable

Отключить редактирование jTable

Как отключить редактирование значений ячеек, но оставить возможность выделять строку в jTable?

220
Почему неправильно выполняется 8 и 15 тест?

Почему неправильно выполняется 8 и 15 тест?

Не могу решить проблему, тест 8 и 15 выполняются не правильноМожете дать подсказку что не так

146