【问题标题】:How to implement proper pagination in Google App Engine (Java)?如何在 Google App Engine (Java) 中实现正确的分页?
【发布时间】:2015-01-03 18:15:44
【问题描述】:

我尝试在谷歌应用引擎(Java)中实现分页,但我无法实现。只能进行正向分页,不能实现反向分页。

我尝试通过 HTTP 请求存储之前的光标值,如下所示:

JSP 文件:

<a href='/myServlet?previousCursor=${previousCursor}'>Previous page</a>
<a href='/myServlet?nextCursor=${nextCursor}'>Next page</a>

Servlet 文件:

    String previousCursor = req.getParameter("previousCursor");
    String nextCursor = req.getParameter("nextCursor");
    String startCursor = null;
    if(previousCursor != null){
        startCursor = previousCursor;
    } 

    if(nextCursor != null){
        startCursor = nextCursor;
    }

     int pageSize = 3;
     FetchOptions fetchOptions = FetchOptions.Builder.withLimit(pageSize);

     if (startCursor != null) {
         fetchOptions.startCursor(Cursor.fromWebSafeString(startCursor));
      }

        Query q = new Query("MyQuery");
        PreparedQuery pq = datastore.prepare(q);
        QueryResultList<Entity> results = pq.asQueryResultList(fetchOptions);

        for (Entity entity : results) {
          //Get the properties from the entity
        }
         String endCursor = results.getCursor().toWebSafeString(); 
        req.setAttribute("previousCursor", startCursor);
        req.setAttribute("nextCursor", endCursor);

有了这个我可以保留之前的光标值,但不幸的是之前的光标似乎是无效的。

我也尝试过使用 reverse() 方法,但是没有用。它的工作原理与转发相同。

那么有什么方法可以在谷歌应用引擎(Java)中实现正确的分页(前进和后退)?

我发现了类似的,发布于 2010 年。这里的答案也是使用 Cursor。但正如我上面显示的那样,它不起作用。 Pagination in Google App Engine with Java

【问题讨论】:

  • 另一个答案是使用 Python,但想法保持不变。
  • @Lipis,同样的想法并不意味着“重复 Q”——不熟悉 Python 的 Java 程序员将很难将代码翻译成他/她最喜欢的语言,所以这个 Q 应该是单独留下(并回答,但我的 Java 还不够好:-)。
  • @AlexMartelli 很公平......我删除了重复的问题链接,是的......我的 Java 也不是这个领域最强大的,可以进一步帮助:) (P.S. 欢迎回到 SO.. 我们想念你:)
  • 类似的问题,但可以在此处找到以 Python 方式解决的问题:stackoverflow.com/questions/17975070/…
  • 是的,这些都在 python 中。但是在java中却无法实现。我认为我们可以通过索引来做到这一点,但不确定。还没人回答呢,还是自己通过索引试试吧

标签: java google-app-engine jakarta-ee pagination


【解决方案1】:

如果您熟悉 JPA,可以尝试一下。 已经对其进行了测试,并且分页在 GAE 中有效。 我认为他们现在支持 JPA 1.0。

我尝试的是,创建了一个 Employee 实体。 创建了 DAO 层并保留了一些员工实体。

要进行分页获取,请执行以下操作:

Query query = em.createQuery("select e from Employee e");
query.setFirstResult(0);
query.setMaxResults(2);
List<Employee> resultList = query.getResultList();

(在这个例子中,我们得到第一页有 2 个实体。参数 setFirstResult 将是起始索引,而 setMaxResult 的参数将是您的页面大小)

您可以轻松地将参数更改为 query.setFirstResult 和 setMaxResults 并有一个分页逻辑。

希望这会有所帮助,

问候,

【讨论】:

    猜你喜欢
    • 2010-11-03
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    相关资源
    最近更新 更多