在hibernate中实现结果分页(获取总行数)

如何在Hibernate中实现分页? Query对象有一些名为setMaxResultssetFirstResult方法,这些方法当然很有帮助。 但是我在哪里可以获得结果总数,以便我可以显示结果最后一页的链接,并打印结果200到250的xxx

您可以使用Query.setMaxResults(int results)和Query.setFirstResult(int offset)。

编辑:没有办法知道你会得到多少结果。 因此,首先您必须使用“select count(*)…”进行查询。 有点难看,恕我直言。

您必须执行单独的查询以获取最大结果…并且在客户端第一次发出分页请求的时间A到发出另一个请求的时间B之间,如果添加了新记录或者现在添加了一些记录如果符合标准,则必须再次查询max以反映这一点。 我通常在HQL中这样做

 Integer count = (Integer) session.createQuery("select count(*) from ....").uniqueResult(); 

对于Criteria查询,我通常会将数据推送到这样的DTO中

 ScrollableResults scrollable = criteria.scroll(ScrollMode.SCROLL_INSENSITIVE); if(scrollable.last()){//returns true if there is a resultset genericDTO.setTotalCount(scrollable.getRowNumber() + 1); criteria.setFirstResult(command.getStart()) .setMaxResults(command.getLimit()); genericDTO.setLineItems(Collections.unmodifiableList(criteria.list())); } scrollable.close(); return genericDTO; 

你可以执行两个查询 – 一个count(*)类型的查询,如果你没有连接太多的表,它应该很便宜,第二个查询设置了限制。 然后你知道有多少项存在,但只抓住正在查看的项目。

您可以将setMaxResults设置为要返回的最大行数。 将此值设置为大于可用实际行数没有任何害处。 其他解决方案的问题是他们假设每次重复查询时记录的顺序保持不变,并且命令之间没有任何变化。

要避免这种情况,如果您真的想要滚动浏览结果,最好使用ScrollableResults。 不要在分页之间抛弃此对象,而是使用它来保持记录的顺序相同。 要查找ScrollableResults中的记录数,您只需移动到last()位置,然后获取行号。 请记住将此值加1,因为行号从0开始计数。

我个人认为你应该在前端处理分页。 我知道这不是那么有效,但至少它不会出错。

如果您使用count(*)事件,如果在某个页面的请求之间从表中删除记录会发生什么? 很多事情都可能出错。