我在运行Spring Data Jpa分页时无法获得指定的页面间隔。

huangapple 未分类评论43阅读模式
英文:

I don't get the specified page interval while running Spring Data Jpa Pagination

问题

  • 实体
@Table(name = "EMPLOYEES_VIEW")
@Entity
public class EmployeeView {

    @Id
    @Column(name = "EMPLOYEEID")
    private Long employeeId;

    @Column(name = "ADDRESS")
    private String address;

    @Column(name = "FIRST_NAME")
    private String firstName;

    @Column(name = "LAST_NAME")
    private String lastName;

    @Column(name = "SALARY")
    private Double salary;
}
  • 仓库
public interface EmployeeViewPaginationRepository extends PagingAndSortingRepository<EmployeeView, Long> {
    List<EmployeeView> findAllBySalary(Double Salary, Pageable pageable);
}
  • 服务
/**
 *
 * @param salary 查询的字段值
 * @param numberPage 要获取请求列表的起始页数
 * @param amountPage 每个请求接收的页数
 * @return
 */
@Override
public Iterable<EmployeeViewDto> getAllBySalary(Double salary, Integer numberPage, Integer amountPage) {

    PageRequest pageRequest = PageRequest.of(numberPage, amountPage);

    Iterable<EmployeeView> employeeViews = findEmployeesFromViewPagination(salary, pageRequest);

    Iterable<EmployeeViewDto> listDto = transformViewPagToListDto(employeeViews);

    return listDto;
}


private Iterable<EmployeeView> findEmployeesFromViewPagination(Double salary, Pageable pageable){

    Iterable<EmployeeView> allEmployees = this.paginationRepository.findAllBySalary(salary, pageable);

    return allEmployees;
}

我使用以下参数进行分页:

  • Integer numberPage = 0;

  • Integer amountPage = 5;

我获得了结果。

我使用以下参数进行分页:

  • Integer numberPage = 1;

  • Integer amountPage = 5;

我获得了0条记录。

我尝试了以下查询:

select
        *
    from
        ( select
            row_.*,
            rownum rownum_
        from
            ( select
                employeevi0_.employeeid as employeeid1_5_,
                employeevi0_.address as address2_5_,
                employeevi0_.first_name as first_name3_5_,
                employeevi0_.last_name as last_name4_5_,
                employeevi0_.salary as salary5_5_
            from
                employees_view employeevi0_
            where
                employeevi0_.salary=800.00 ) row_
        where
            rownum <= 10
        )
    where
        rownum_ > 2;

我有一个包含10条记录的表格。

有人知道为什么会发生这种情况吗?

解决方案。

我明白了。

当我们指定要导航的总页数时,我们从初始值开始计算指定数量的页数。

例如。

0、4 - 我们将获得从第1页到第4页的页面。

1、4 - 我们将获得从第5页到第9页的页面。

也就是说,如果我们有10页,那么在这种情况下我们将看到3页。

因此,第一个参数是页码...

Iterable<EmployeeViewDto> getAllBySalaryFromRefCursor(Integer numberPage, Integer amountPage);
英文:
  • entity
@Table(name = &quot;EMPLOYEES_VIEW&quot;)
@Entity
public class EmployeeView {

    @Id
    @Column(name = &quot;EMPLOYEEID&quot;)
    private Long employeeId;

    @Column(name = &quot;ADDRESS&quot;)
    private String address;

    @Column(name = &quot;FIRST_NAME&quot;)
    private String firstName;

    @Column(name = &quot;LAST_NAME&quot;)
    private String lastName;

    @Column(name = &quot;SALARY&quot;)
    private Double salary;
  • repository
public interface EmployeeViewPaginationRepository extends PagingAndSortingRepository&lt;EmployeeView, Long&gt; {
    List&lt;EmployeeView&gt; findAllBySalary(Double Salary, Pageable pageable);

}
  • service

    /**
     *
     * @param salary value of field that is done an query
     * @param numberPage start number of the page to get the requested list from
     * @param amountPage the number of pages received per request
     * @return
     */
    @Override
    public Iterable&lt;EmployeeViewDto&gt; getAllBySalary(Double salary, Integer numberPage, Integer amountPage) {

        PageRequest pageRequest = PageRequest.of(numberPage, amountPage);

        Iterable&lt;EmployeeView&gt; employeeViews = findEmployeesFromViewPagination(salary, pageRequest);

        Iterable&lt;EmployeeViewDto&gt; listDto = transformViewPagToListDto(employeeViews);

        return listDto;
    }


    private Iterable&lt;EmployeeView&gt; findEmployeesFromViewPagination(Double salary, Pageable pageable){

        Iterable&lt;EmployeeView&gt; allEmployees = this.paginationRepository.findAllBySalary(salary, pageable);

        return allEmployees;
    }

I pass these parameters for pagination:

  • Integer numberPage = 0;

  • Integer amountPage = 5;

I get the result.

I pass these parameters for pagination:

  • Integer numberPage = 1;

  • Integer amountPage = 5;

I get 0 entries.

I tried that.

select
        *
    from
        ( select
            row_.*,
            rownum rownum_
        from
            ( select
                employeevi0_.employeeid as employeeid1_5_,
                employeevi0_.address as address2_5_,
                employeevi0_.first_name as first_name3_5_,
                employeevi0_.last_name as last_name4_5_,
                employeevi0_.salary as salary5_5_
            from
                employees_view employeevi0_
            where
                employeevi0_.salary=800.00 ) row_
        where
            rownum &lt;= 10
        )
    where
        rownum_ &gt; 2;

I have table with 10 entries.

Who has any idea why this is happening?

Solution.

I understood.

When we specify the total number of pages to navigate, we count the specified number from the initial value.

For example.

0, 4-we will get pages from 1st to 4th.

1, 4 - we will get pages from 5 to 9.

That is, if we have 10 pages, in this case we will see 3 pages.

So the first parametr is the page number...

 Iterable&lt;EmployeeViewDto&gt; getAllBySalaryFromRefCursor(Integer numberPage, Integer amountPage);

huangapple
  • 本文由 发表于 2020年4月8日 22:16:53
  • 转载请务必保留本文链接:https://java.coder-hub.com/61102883.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定