web-dev-qa-db-ja.com

Spring Data JPAでページ付けと基準クエリを組み合わせる方法は?

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

14
Mariusz

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番目のクエリメソッドは、カウントクエリを実行せずにプレーンスライスされた結果セットを返します。

13
Oliver Drotbohm

ページネーションには、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 ;
}
4
Rahul Agrawal