【问题标题】:Displaying a result of a query from the database in increments以增量方式显示来自数据库的查询结果
【发布时间】:2010-11-27 09:17:31
【问题描述】:

我想显示我网站中所有用户的列表,但我只想显示每个年龄的 10 人。我不知道该怎么做。我知道如何通过在一个页面中显示所有用户来做到这一点,但这不是很好,是吗?

如果我用我现在的代码来做,它只会一遍又一遍地获得前十个用户。 我希望能够一次性查询所有用户,将其存储在全局范围内,然后在列表中移动以检索下一个 10,依此类推以进行显示。

我正在使用Java和Spring Framework在appengine上开发一些我一直在思考的解决方案,

  1. 存储在会话中并遍历列表(我猜很糟糕)
  2. 将它交给JSP,特别是范围、页面、请求等之一。但我认为请求不起作用。
  3. 寻找可以处理此问题的 Spring 控制器。

【问题讨论】:

  • 您使用的是哪种数据库产品?
  • 我正在使用 AppEngine 的数据存储区。那是一个 JDO 数据库。

标签: java google-app-engine servlets spring-mvc spring


【解决方案1】:

一般来说,您会在页面上使用一个名为“page”的表单变量(通过 GET 或 POST),它是一个数字。当您在 servlet 中收到该信息时,您将根据页码和每页配置的行数计算范围。

查看 Google App Engine 文档中的 Paging through large datasets(是的,它是 Python,但原理相同)和 Queries and Indexes

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      如果您将页面大小保持为 10,那么您可以根据页码为每个页面检索每个年龄组的 10 个用户:

      SELECT TOP 10 users FROM myusers 
       WHERE AGE = function(page_number) 
       ORDER BY some_ordering
      

      希望 JPA + appengine 支持这种类型的查询。

      【讨论】:

        【解决方案4】:

        一些数据库引擎为此目的提供了方便的 SQL 扩展。就像,在 MySQL 中,您可以说“select ...whatever ...limit 50,10”,其中“50”是要开始的行,10 是要检索的行数。然后在您的显示页面上,您只需放置下一个和上一个按钮,这些按钮将适当的起始行号传回服务器,以便下次运行查询。

        如果您使用的 SQL 引擎没有这种方便的功能,那么您必须根据排序顺序构建一个特定于查询的“where”子句。

        举一个简单的例子,假设在您的示例中,您按“user_name”的顺序显示记录。您可以使用 Statement.setMaxRows(10) 将任何查询限制为 10 行。然后在你的第一次通话中,你执行,说,“选择......随便......从用户名中的用户订单”。保存找到的最后一个用户名。在下一个按钮中,将此用户名传回服务器,下一次调用的查询是“select ...whatever ... from user where user_name>'xxx' order by user_name”,其中 'xxx' 是上次调用的最后一个用户名。再次执行 setMaxRows 以再次限制为 10 行输出。然后,您可以让用户以这种方式逐步完成整个输出。

        让用户倒退有点痛苦。我通过在会话变量中保存一个表来完成它,其中包含每个页面的起始键值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-09
          • 2013-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-28
          • 1970-01-01
          • 2013-11-17
          相关资源
          最近更新 更多