Получить JPAQuery результаты в виде страницы - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть JPAQuery, который я не могу преобразовать в весенний findBy... запрос.Мне удалось получить только небольшое количество запрошенных результатов, используя offset и limit.Проблема в том, что для фактического разбивки моих результатов на страницы мне нужны те же данные, которые я получал бы с помощью методов весеннего хранилища (общее количество результатов и количество страниц).Мой код выглядит следующим образом:

public List<Long> findByCountryId(Long countryId, Pageable pageable) {
    JPAQuery<Long> query = new JPAQuery<>(this.entityManager);
    // innerJoins, where, ...
    query
            .offset(pageable.getOffset())
            .limit(pageable.getPageSize());
    return query.fetch();
}

Я думал о создании страницы самостоятельно, но я предполагаю, что мне нужно было бы запросить весь набор результатов вместо выборки менее 50 строк, и я мог быесть тысячи результатов по этому запросу.

Есть ли чистый способ извлечь страницу из JPAQuery?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

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

public interface SomeEntityRepository extends Repository<SomeEntity, Long>,
    PagingAndSortingRepository<SomeEntity, Long>, JpaSpecificationExecutor<SomeEntity> {

    @SuppressWarnings("serial")
    public static Specification<SomeEntity> findByCountryIdSpecification(Long countryId) {
        return new Specification<SomeEntity>() {
            @Override
            public Predicate toPredicate(Root<SomeEntity> root, CriteriaQuery<?> query,
                CriteriaBuilder criteriaBuilder) {
                // implement query logic with "countryId" here
                return null;
            }
        };
    }
//  there will be a method like below with JpaSpecificationExecutor
//  Page<SomeEntity> findAll(Specification<SomeEntity> specification, Pageable pageable);
}

При правильно разработанной спецификации использование pageable легко:

repo.findAll(SomeEntityRepository.findByCountryIdSpecification(countryId), pageable);
0 голосов
/ 14 февраля 2019

Это то, что делает пейджинг в JPA.Сначала требуется информация о количестве строк, чтобы проверить, не превышает ли ваше смещение данные, затем выполняется фактический запрос к данным, если это возможно, в противном случае выдается исключение.

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