代码之家  ›  专栏  ›  技术社区  ›  flybywire

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

  •  9
  • flybywire  · 技术社区  · 15 年前

    如何在休眠中实现分页?这个 Query 对象具有调用的方法 setMaxResults setFirstResult 这当然有帮助。但是我在哪里可以得到结果的总数,这样我就可以显示到结果的最后一页的链接,并打印诸如结果200到250的 XXX ?

    5 回复  |  直到 11 年前
        1
  •  12
  •   sinuhepop    15 年前

    您可以使用query.setmaxresults(int results)和query.setfirstresult(int offset)。

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

        2
  •  7
  •   non sequitor    15 年前

    您必须执行单独的查询以获得最大结果……如果在第一次的时间A之间,客户机在发出另一个请求时向时间B发出分页请求,如果添加了新记录或某些记录现在符合条件,则必须再次查询最大值以反映这一点。我通常在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;
    
        3
  •  1
  •   Chii    15 年前

    您可以执行两个查询——一个count(*)类型的查询,如果您不将太多的表连接在一起,它应该是便宜的;另一个查询设置了限制。然后你知道有多少个项目存在,但只抓取被查看的项目。

        4
  •  0
  •   Bill    11 年前

    您可以将maxresults设置为希望返回的最大行数。将该值设置为大于可用的实际行数没有任何危害。其他解决方案的问题是,它们假定记录的顺序在每次重复查询时都保持不变,并且命令之间不会发生更改。

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

        5
  •  -2
  •   NickDK    15 年前

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

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