DisplayTag分页与Hibernate分页

DisplayTag分页与Hibernate分页,hibernate,displaytag,Hibernate,Displaytag,显示标记提供给定对象的分页功能。Hibernates提供了只获取每页所需记录的选项 显示标签: 我需要根据筛选条件获取所有记录并将其存储在会话中。然后这个displaytag将负责所有分页和排序,因此Httpsession保存了大量数据 休眠: 它只从数据库中获取请求的对象数。需要为每个请求打开会话 最好的方法是什么?或者如果我们能同时做到这两件事,怎么做?请在此方面提供帮助。如您所述,使用DisplayTag,您需要获取所有结果并将其放入会话中。因此,您只需要执行一个(可能非常昂贵的)查询,但

显示标记提供给定对象的分页功能。Hibernates提供了只获取每页所需记录的选项

显示标签: 我需要根据筛选条件获取所有记录并将其存储在会话中。然后这个displaytag将负责所有分页和排序,因此Httpsession保存了大量数据

休眠: 它只从数据库中获取请求的对象数。需要为每个请求打开会话


最好的方法是什么?或者如果我们能同时做到这两件事,怎么做?请在此方面提供帮助。

如您所述,使用DisplayTag,您需要获取所有结果并将其放入会话中。因此,您只需要执行一个(可能非常昂贵的)查询,但从内存的角度来看,这并不能很好地扩展(如果您需要获取大量结果或增加并发用户的数量)

另一方面,使用Hibernate,您可以使用
setFirstResult
setMaxResult
仅获取每页上实际显示的记录。这需要对每个页面执行查询,但会扩展到无限多个结果

就我个人而言,我更喜欢第二种方法,我发现这种方法内存效率更高——特别是因为大多数用户不会浏览所有页面(所以为什么要加载所有结果)——并使用中描述的模式

如果您决定坚持第一种方法,我将实现某种最大结果数限制,以避免过于昂贵的查询。如果查询超出限制,请要求用户执行更严格的搜索,即添加条件(到底谁将浏览数千个结果?)


如果您需要所有结果,例如用于报告目的,那么在我看来,DisplayTag和statefull会话都不是正确的工具。

您实际上不需要获取所有结果,您可以使用名为外部分页的DisplayTag功能,告诉Displaytag您正在Displaytag外部处理分页

有关详细信息,请参阅Displaytag文档中的

此外,还有更多信息和示例代码