Подтвердить что ты не робот

Критерий спящего режима возвращает страницу и строку

Используя критерии Hibernate, я пытаюсь достичь разбивки на страницы, но проблема в том, что для каждой страницы fetch мне нужно сделать два вызова db для результатов, а другое для общего количества записей. Есть ли эффективный способ, чтобы в одном вызове 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
4b9b3361

Ответ 1

Да вам нужен отдельный запрос, чтобы получить итоговый результат.

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

Ответ 2

Насколько я знаю, нет прямого метода для этого. Как просто, как вы можете сделать, напишите небольшой hql query (мой выбор), наряду с вашим основным criteria.

Number count = (Number) session.createQuery(
    "select count(s.id) from Student s").uniqueResult();