【问题标题】:How to restrict displaytag to make database call on sorting?如何限制显示标签以在排序时调用数据库?
【发布时间】:2014-07-16 07:25:18
【问题描述】:
我有一个包含 1000 条记录的列表,我在页面加载时使用显示标签显示了 1000 条记录。
我在某些列上启用了排序,当我单击表头进行排序时,显示标签正在调用数据库并再次加载所有 1000 条记录。
我们如何限制在排序显示标签时进行数据库调用?
因为,我们已经加载了所有 1000 条记录,所以我们可以在不重新加载记录的情况下使用这些列表吗?
【问题讨论】:
标签:
sql
struts2
pagination
displaytag
【解决方案1】:
您缺少基本知识:Pagination。
您不应一次加载 1000 条记录;而是一次加载 10 条记录(假设 10 条记录是您在页面中显示的内容),并在更改页面/排序时加载其他 10 条。
直接在查询中过滤它们(如果您正在使用查询),例如,在查询中选择第 3 页(结果从 21 到 30)到按名称排序的最小“人员表”,结果如下SQL:
甲骨文
SELECT id, name, age
FROM ( SELECT id, name, age
FROM table_person
ORDER BY name )
WHERE ROWNUM BETWEEN 21 and 30
PostgreSQL
SELECT id, name, age
FROM table_person
ORDER BY name
LIMIT 10
OFFSET 20
等等。
请务必阅读与您的数据库相关的文档,并且只需使用查询参数指定 order by、starting row 和 ending row 值。
【解决方案2】:
您可以使用 setFirstResults()、setMaxResults(),而不是不必要地加载所有 1000 条记录。
divde per page max result 仅显示 10 条记录,而 setFirstResult 是记录列表中的前 5 条记录。
Criteria cr= database_session.createCriteria(Records.class);
cr.addOrder(Order.desc("Recordsdate"));
cr.setFirstResult(5);
cr.setMaxResults(10);
all_records_list = (List<Records>) cr.list();