以增量显示数据库中的查询结果

时间:2009-09-11 03:29:08

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

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

如果我使用现在的代码执行此操作,它将只会反复获得前十个用户。 我希望能够让所有用户进行一次性查询,将其全局存储,然后在列表中移动,检索下一个10,依此类推以进行显示。

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

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

4 个答案:

答案 0 :(得分:1)

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

请查看Paging through large datasets(是的,但它是相同的原则适用于Python)和Queries and Indexes来自Google App Engine文档。

答案 1 :(得分:0)

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

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

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