以页面的形式获取JPAQuery结果

时间:2019-02-14 16:08:11

标签: java spring-boot jpa pagination spring-data-jpa

我有一个JPAQuery,无法将其转换为spring [[1 1 0] [.05 1 2] [.05 .25 1] ] 查询。我设法使用findBy...offset仅获得了少量请求的结果。问题在于,为了对结果进行实际的分页,我需要使用Spring存储库方法获得的数据(结果总数和页面总数)。我的代码现在看起来像这样:

limit

我曾考虑过自己构建页面,但我想我将不得不请求整个结果集,而不是获取少于50行,这样我就可以从该查询中获得数千个结果。

是否有一种从JPAQuery提取页面的干净方法?

2 个答案:

答案 0 :(得分:0)

这就是JPA中的分页功能。首先需要有关行数的信息,以检查偏移量是否不超过数据,然后在可能的情况下针对数据运行实际查询,否则将引发异常。

答案 1 :(得分:0)

我可能可以借助规范来更轻松地实现,但不知道,因为我不确定您的实际需求。无论如何,请参见以下存储库,有关它的规范,尤其是其实现的接口

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);