使用Hibernate Criteria我正在尝试实现分页,但问题是对于每个页面提取我必须为结果进行两次db调用,对于总记录计数进行另一次db调用。 有没有任何有效的方法,以便在单个数据库调用中我可以获得数据或我可以减少数据库调用。
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
答案 0 :(得分:22)
是的,您需要单独的查询才能获得总结果计数。
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();
答案 1 :(得分:1)
据我所知,没有直接的方法可以做到这一点。尽可能简单的是写一个小hql query
(我的选择),以及你的主criteria
。
Number count = (Number) session.createQuery(
"select count(s.id) from Student s").uniqueResult();