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

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

  •  11
  • flybywire  · 技术社区  · 16 年前

    如何在Hibernate中实现分页?这 Query 对象具有调用的方法 setMaxResults setFirstResult 某某某 ?

    6 回复  |  直到 16 年前
        1
  •  12
  •   sinuhepop    16 年前

    您可以使用Query.setMaxResults(int结果)和Query.setFirstResult(int偏移量)。

    编辑也是:无法知道你会得到多少结果。因此,首先您必须使用“select count(*)…”进行查询。有点丑,依我之见。

        2
  •  7
  •   non sequitor    16 年前

    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    16 年前

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

        4
  •  0
  •   Bill    13 年前

    然后执行以下操作:-

     CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
       CriteriaQuery<Feedback> criteriaQuery = criteriaBuilder.createQuery(Feedback.class);
    

    //只需根据您的业务需求准备所有预测。 //例如:-

     yourPredicateAsPerYourBusnessNeed = criteriaBuilder.equal(Root.get("applicationName"), applicationName);
     criteriaQuery.where(yourPredicateAsPerYourBusnessNeed).distinct(true);
    
       TypedQuery<Feedback> criteriaQueryWithPredicate = em.createQuery(criteriaQuery);
       //Getting total Count Here
       Long totalCount = criteriaQueryWithPredicate.getResultStream().distinct().count();
    

    因此,现在我们可以对上面手头的数据进行分页,如下所示:-

    List<Feedback> feedbackList = criteriaQueryWithPredicate.setFirstResult(offset).setMaxResults(pageSize).getResultList();
    

    现在,您可以准备一个包装器,其中包含DB返回的List以及totalCount、startingPageNo(在这种情况下是偏移的)、pageSize等,并可以返回到您的服务/控制器类。

    我有101%的把握,这将解决你的问题,因为我面临着同样的问题,并以同样的方式解决了它。 谢谢-苏尼尔·库马尔·马里

        5
  •  -2
  •   NickDK    16 年前

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

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