2012-10-08 9 views
10

私はPagingAndSortingRepositoryとfindAll(Pageable pageable)メソッドを使用してデータをページングします。私はどんな条件を提供する方法もないと思います。たとえば、都合のついた選択とページングアドレスが必要な場合があります。条件とページングを同時に提供する方法はありますか?あなたは休止状態でこの機能を利用し同様にgetCount(ページング可能ページング可能)とのfindAll(ページング可能ページング可能)Spring Data JPAでページ付けを基準クエリと組み合わせる方法は?

のような2つの方法を必要とするページネーションについて

答えて

10

PagingAndSortingRepositoryだけの非常に基本的なCRUDメソッドを追加し、あなたが任意のHQLクエリを持っている場合は、単にこれを行うことができますページ区切りモード。 reference documentationに記載されているように、定義したクエリメソッドにPageableパラメータを追加するだけで、このクエリのページ区切りを実現できます。

interface CustomerRepository implements Repository<Customer, Long> { 

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

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

第一の方法は、それが派生したクエリのための追加のカウントクエリをトリガします。このデータを計算するために利用可能な合計要素などのようなページ・メタデータを含むPageを返します。 2番目のクエリメソッドは、実行されているカウントクエリを使用せずに平滑化された結果セットを返します。

+0

Hello @OlivierはPageagleを持っています。私は 'offset'をどこに指定するのかわかりません。' PageRequest'は 'page'と' size'しか受け付けません。なぜ私は 'offset * 'を得るために' page * size'をしなければならないのか分かりません。 'page'ではなく' offset'を使う方法はありますか? –

+1

'PageRequest'が' page'と 'size'を' offset'だけ公開している理由は 'size'が必要なので十分ではありません。ページネーションの概念は、通常、ここで表現しているページ中心のデータビューを意味します。しかし、オフセットやサイズで動作する 'Pageable'の独自の実装を思いつくことはできません。 –

+0

Query APIでPagivationを使用するにはどうすればよいですか? –

2

、しかし、自明です。あなたが基準のクエリを持っている場合

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; 
} 

は同様に、それが効果的に同じことだ:

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 ; 
} 
+0

ありがとうございました。私はJPAソリューションを探しましたが、DataNucleusは質問のタグからJPAを削除しました。私は、休止状態の提供者であることを表現するために休止状態のタグを使用しました。 – Mariusz

関連する問題