一尘不染

JPA分页与数字和下一个,上一个

hibernate

对于有人问过这个问题,或者提出一个愚蠢的问题,我深表歉意。但是,我是新手,您是专家,我很乐意向您学习专家的建议和经验。

我想将分页添加到每页显示200条记录的应用程序中。页面底部应有数字。如果有1050,则第一页将显示100,而页面底部将显示数字1,2,3,4,5和6。

实现此目的的一般逻辑是什么?我知道数据库每次必须选择200,并且我必须跟踪第一条记录。

  1. 有没有一种方法可以知道总共将返回多少条记录,这样我就可以知道要在页面底部显示多少个数字?是否需要选择count()语句或其他?
  2. 对于1050条记​​录,将显示数字1,2,3,4,5和6,单击每个数字都需要调用服务器。有没有办法知道在下一次调用服务器时将返回多少记录?是否需要选择count()语句或其他?

阅读 209

收藏
2020-06-20

共1个答案

一尘不染

您可以使用JPA Criteria
API
来完成此任务。假设TypedQuery,您将使用setFirstResultsetLastResult限制从数据库返回的记录。当然,这些方法的值将取决于请求的页面以及每页显示多少记录。

first = (page - 1) * page size;
last = (page * size) - 1;

注意: 这假设第一页为1(而不是零)。

要获取记录计数,您可以执行标准的条件查询。举个例子:

final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
final CriteriaQuery<Long> countQuery = builder.createQuery(Long.class);
countQuery.select(builder.count(countQuery.from(MyEntity.class)));
final Long count = entityManager.createQuery(countQuery)
        .getSingleResult();

您可以自定义上面的代码来执行相对于另一个查询的计数。最后,您需要某种方式将总数传递回客户端。一种方法是将查询的结果集包装在另一个包含计数属性的对象中,或者将其作为DAO调用的结果返回。或者,您可以将count属性存储在请求范围内的对象中。

public class ResultListWrapper<T> {
    private Long count;
    private Collection<T> results;

    // constructor, getters, setters
}
2020-06-20