17

Hibernate Criteria を使用して、ページネーションを達成しようとしていますが、問題は、ページフェッチごとに、結果用に 1 つ、合計レコード数用に 2 つの db 呼び出しを行う必要があることです。1回の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
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、あなたのメインと一緒に小さな(私の選択)を書くことですcriteria.

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