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

ebdffaop  于 2022-11-14  发布在  其他
关注(0)|答案(6)|浏览(239)

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

aamkag61

aamkag611#

可以使用Query.setMaxResults(整型结果)和Query.setFirstResult(整型偏移量)。
编辑:没有办法知道你会得到多少结果。因此,首先必须使用“SELECT COUNT(*)...”进行查询。有点难看,我的。

bweufnob

bweufnob2#

您必须执行单独的查询才能获得最大结果...在客户端第一次向时间B发出寻呼请求时发出另一个请求的时间A之间,如果添加了新记录或某些记录现在符合条件,则必须再次查询最大值以反映这一点。我在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;
wtlkbnrh

wtlkbnrh3#

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

bbmckpt7

bbmckpt74#

你可以做一件事。只需根据您的业务需求准备条件查询,包括所有 predicate 、排序、搜索等,然后执行以下操作:-

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

//只需根据您的业务需要准备您的所有 predicate 。//例如:-

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();

现在您可以准备一个 Package 器,其中包含由DB返回的列表以及totalCount、startingPageNo(在本例中为偏移量)、页面大小等,并且可以返回到您的服务/控制器类。
我有101%的把握,这将解决你的问题,因为我面临着同样的问题,并以同样的方式解决了它。谢谢--苏尼尔·库马尔·马里

q9yhzks0

q9yhzks05#

只需将MaxResults设置为希望返回的最大行数即可。将此值设置为大于实际可用行数并无坏处。其他解决方案的问题是,它们假设每次重复查询时记录的顺序保持不变,并且命令之间没有变化。
为了避免这种情况,如果您真的想滚动浏览结果,最好使用ScrollableResults。不要在两次分页之间丢弃这个对象,而是使用它来保持记录的顺序相同。要从ScrollableResults中找出记录数,只需移到最后一个()位置,然后获取行号。记住将该值加1,因为行号从0开始计数。

zmeyuzjn

zmeyuzjn6#

我个人认为您应该在前端处理寻呼。我知道这不是那么有效,但至少它不会那么容易出错。
如果您使用COUNT(*),如果在对某个页面的请求之间从表中删除记录,将会发生什么情况?很多事情都可能以这种方式出错。

相关问题