16

PagingAndSortingRepository と findAll(Pageable pageable) メソッドを使用して、データをページングします。条件を提供する方法はないと思います。たとえば、city=NY のアドレスを選択してページングしたい場合があります。条件とページングを同時に提供する方法はありますか?

4

2 に答える 2

14

PagingAndSortingRepositoryページネーション モードで非常に基本的な CRUD メソッドを追加するだけです。リファレンス ドキュメントに記載されているように、Pageable定義した任意のクエリ メソッドにパラメーターを追加するだけで、このクエリのページネーションを実現できます。

interface CustomerRepository implements Repository<Customer, Long> {

  Page<Customer> findByLastname(String lastname, Pageable pageable);

  List<Customer> findByFirstname(String firstname, Pageable pageable);
}

最初のメソッドは、使用可能な要素の総数などのページ メタデータを含む を返しPageます。このデータを計算するために、派生したクエリに対して追加のカウント クエリがトリガーされます。2 番目のクエリ メソッドは、count クエリを実行せずに、スライスされたプレーンな結果セットを返します。

于 2012-10-09T06:07:48.507 に答える
4

ページネーションには、getCount(Pageable pageable) と findAll(Pageable pageable) のような 2 つのメソッドが必要です。

ただし、Hibernate でこの機能を利用するのは簡単です。HQL クエリがある場合は、次のように簡単に実行できます。

public Long getCount(Pageable pageable) {
    Query q = session.createQuery("Select count(t) From TableClass  t where t.city = 'NY'");
    Long cnt = (Long) q.uniqueResult();
    return cnt;
}

public List<TableClass> findAll(Pageable pageable) {
     Query q = session.createQuery("From TableClass  t where t.city = 'NY'");
     q.setFirstResult(start);
     q.setMaxResults(length);
     List<TableClass> tableClasslist = q.list();
     return tableClasslist;
}

同様に、Criteria クエリがある場合は、事実上同じです。

public Long getCount(Pageable pageable) {
    Criteria c = session.createCriteria(TableClass.class);
    c.setProjection(Projections.rowCount()); 
    Long cnt = (Long) c.uniqueResult();
    return cnt;
}

public List<TableClass> findAll(Pageable pageable) {
    Criteria c = session.createCriteria(TableClass.class);
    c.setParameter("city","NY");
    c.setFirstResult(start);
    c.setMaxResults(length);
    List<TableClass> tableClasslist = c.list();
    return tableClasslist ;
}
于 2012-10-08T14:08:53.323 に答える