17

使用 Hibernate Criteria 我正在尝试实现分页,但问题是对于每个页面获取我必须进行两个数据库调用,一个用于结果,另一个用于总记录数。有没有什么有效的方法可以让我在单个数据库调用中同时获取数据或者我可以减少数据库调用。

 Criteria criteria=session.createCriteria(Student.class);
 criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
 criteria.add(Restrictions.ne("enquiryStatus", ENQUIRY.JOINED));
 criteria.setMaxResults(10);
 criteria.setFirstResult((paginate.getStartIndex()-1)*10);

 criteria.setProjection(Projections.rowCount());
//here i need to fetch total row count and records
4

2 回答 2

23

是的,您需要单独的查询来获取总结果数。

    Query aCountQuery  = session.createQuery("select count(s.id) from Student s 
           where s.enquiryStatus != :enquiryStatus");
           aCountQuery.setParameter("enquiryStatus", ENQUIRY.JOINED);
    Long resultCount = (Long)aCountQuery.uniqueResult();

或者

   Criteria criteria=session.createCriteria(Student.class);
        criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        criteria.add(Restrictions.ne("enquiryStatus", ENQUIRY.JOINED));
        criteria.setProjection(Projections.rowCount())
   Long resultCount = (Long)criteria.uniqueResult();

更新

现在,您可以使用相同的条件来获取具有分页和结果计数的结果

  Criteria criteria=session.createCriteria(Student.class);
     criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
     criteria.add(Restrictions.ne("enquiryStatus", ENQUIRY.JOINED));
     criteria.setMaxResults(10);
     criteria.setFirstResult((paginate.getStartIndex()-1)*10);
     List<Student> students = criteria.list();

    criteria.setProjection(null);
    criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    Long resultCount = (Long)criteria.uniqueResult();
于 2013-08-28T11:07:27.350 回答
1

据我所知,没有直接的方法可以做到这一点。尽可能简单的是写一个小的hql query(我的选择),连同你的 main criteria

Number count = (Number) session.createQuery(
    "select count(s.id) from Student s").uniqueResult();
于 2013-08-28T10:13:30.080 回答