【问题标题】:Jpa paging with numbers and next, previous带有数字和下一个、上一个的 Jpa 分页
【发布时间】:2012-04-13 16:12:26
【问题描述】:

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

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

完成此操作的一般逻辑是什么? 我知道数据库每次都必须选择 200 并且我必须跟踪第一条记录。

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

【问题讨论】:

  • 感谢大家花时间回答我的问题。我会更新我的代码,如果我对此还有其他问题,我会告诉你。

标签: java spring hibernate jpa paging


【解决方案1】:

您可以使用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
}

【讨论】:

    【解决方案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。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        看看Spring Data JPA。它基本上按照 Perception 之前建议的方式工作,只是您不必这样做,框架会为您完成。默认情况下您会获得分页和排序(如果您不想使用Query DSL,您仍然需要自己进行过滤)。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-03
          • 2015-02-12
          • 1970-01-01
          • 2017-02-06
          相关资源
          最近更新 更多