Как отфильтровать страницу при загрузке, сохраняя подкачку? - PullRequest
0 голосов
/ 21 мая 2019

Я получаю страницу из своей базы данных через JpaRepository и хочу отфильтровать эту страницу по имени.

Это мой код:

// other code
Pageable pageable = PageRequest.of(page,size);
Page<Entity> foundEntities = entityRepository.findAll(pageable);

final String compareString = "example";
List<Entity> filteredEntities = foundEntities
    .stream()
    .filter(e -> e.getName().toLowerCase().contains(compareString))
    .collect(Collectors.toList());
foundEntities = new PageImpl<>(filteredEntities, pageable, filteredEntities.size());
//other code

Фильтрация работает, и я получаю только сущности, которые содержат compareString, но подкачка не работает, и я получаю только один список объектов.Когда я не использую фильтр, пейджинг работает правильно.

Ответы [ 2 ]

1 голос
/ 21 мая 2019

По моему мнению, вы должны оставить эту задачу для своей базы данных, а не пытаться обрабатывать ее в своем собственном коде.Ваш код будет легче поддерживать и гораздо более эффективен, так как ваш движок базы данных сможет фильтровать на порядок быстрее, чем любой код Java.

Похоже, что вы используете Spring Data JPA, вы можете достичь этого, просто объявив следующий метод в своем хранилище.

Page<Entity> findAllByNameContaining(String name, Pageable pageable);

Вызов этого метода вернет PageEntity, которые уже были отфильтрованы по запросу.

0 голосов
/ 21 мая 2019

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

public interface VideoRepository extends PagingAndSortingRepository<Video,  Integer>
{
Page<Video> findAllByCategory(String aInCategory, Pageable aInPageable);
}

Тогда используйте этот метод из определенного сервиса. Например.

@Override
public Page<Video> browseVideosByCategory(String aInCategory, int page, int size)
{
    return videoRepository.findAllByCategory(aInCategory, PageRequest.of(page, size));
}

Для ошибки в вашем коде, убедитесь, что вы увеличиваете значение страницы. Не могли бы вы добавить аргументы контроллера и веб-страницу?

Например, страница может быть увеличена нажатием на номер страницы, который содержит ссылку на следующий контроллер.

@GetMapping("/getVideoByCategory/{category}")
public String getVideoByCategory(Model model, @PathVariable String category, @RequestParam(name = "page", defaultValue = "0") int page,
                                 @RequestParam(name = "size", defaultValue = "4") int size) {

    Page<Video> videos = videoService.browseVideosByCategory(category, page, size);
    int[] pages = new int[videos.getTotalPages()];

    model.addAttribute("pages", pages);
    model.addAttribute("category", category);
    model.addAttribute("videos", videos.getContent());

    return "videoViewWithCategory";
}

Количество страниц, добавляемых в модуль.

Наконец, на странице html. Добавьте ссылку на номер страницы, содержащей информацию (номер страницы и Категория, которая является именем в вашем случае). В этом примере используется Thymeleaf.

 <li th:each="p, status:${pages}">
 <a th:href="@{/getVideoByCategory/{category}(category=${category},page = ${status.index} )}" th:text="${status.index}"></a>
 </li>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...