Jpa分页用数字和下一个,前一个

时间:2012-04-13 16:12:26

标签: java spring hibernate jpa paging

如果有人已经问过这个问题并且问了一个可能是愚蠢的问题,我很抱歉,但我是新手,你是专家,我很乐意从你的专家建议和经验中学习。

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

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

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

4 个答案:

答案 0 :(得分:8)

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

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

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

要获取记录计数,请执行标准Criteria查询。举个例子:

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
}

答案 1 :(得分:2)

您通常会执行相同的查询,除了在运行实际查询之前使用count int选择列表而不是列,以查找有多少页面。然后可以使用以下内容来获取休眠中的特定页面:

int maxRecords = // page size ...
int startRow = // page number * page size
Query query = session.createQuery('...');
query.setMaxResults(maxRecords);
query.setFirstResult(startRow);

如果执行额外查询的操作过于昂贵,那么您可以考虑只提供下一个/上一个链接,或者根据需要提供额外的页面(例如,当最后一个加载的数据进入视图时)通过ajax。

为了显示包含显示页码链接的分页结果,我建议(假设您使用jsp页面显示此数据)使用display tag JSP标记库。显示标记处理表格数据的分页和排序显示,假设您可以将其传送到JSP。

答案 2 :(得分:0)

是的,你必须在获取行之前进行选择计数。

答案 3 :(得分:0)

看看Spring Data JPA。它基本上与之前Perception建议的方式有关,只是你不必这样做,框架就是为你做的。默认情况下,您可以进行分页和排序(如果您不想使用Query DSL,仍需要自己进行过滤)。

他们在主页上有一个1小时的视频,显示了一个快速介绍,但你只需要观看大约15分钟就可以了解id的作用。