2017-03-24 7 views
0

ページネーションを使用してデータベースにクエリを実行する際に要件があります。以下に示すように ページネーションが、私は、クエリにページサイズとページインデックスを与えるスプリングデータのページネック

select distinct tp.* from kat_task_property tp inner join kat_task_to_workstream ttw on ttw.ttw_frn_task_id = tp.tp_frn_task_id and ttw.ttw_frn_workstream_id= :workStreamId and ttw.ttw_ended_by is null and tp.tp_ended_by is null and tp.tp_is_active=true and ttw.ttw_is_active=true left join kat_user_to_task_order kto on ttw.ttw_id = kto.uto_frn_task_to_workstream_id and kto.uto_frn_user_id = :userId order by tp.tp_completed_at ,kto.uto_order limit :index, :size 

サンプル結果がなる、インデックスがクエリで0のとき

tp_id  tp_completed_at 
1   2017-02-27 06:47:52 
2   null 
3   null 
4   2017-03-14 12:59:24 
5   null 
6   null 
7   null 

私の要件があり、私は、tp_completed_atがクエリの値の大きさにかかわらずすべてのデータを取得する必要があります。つまり、インデックスがゼロのときにはページ番号を適用すべきではなく、tp_completed_atですべてのエントリをnullにする必要があります。また、indexに0以外の値がある場合は、改ページを適用する必要があります。助けてください

答えて

0

それを行うためにPageableを使うことができます。 PageRequest(ページ、サイズ)例えば

Pageable page = new PageRequest(0, 10); 

:あなたのケースでは

Page<Incident> findByProblemId(Long problemId, Pageable page); 

、 countQuery = "....カウント...制限なし(個別のTPを*。)"

@Query(value = "your existing Query without limit ", countQuery = "countQuery", nativeQuery = true) 
getData(@Param("workStreamId") String workStreamId, @Param("userId") String userId, Pageable page); 
+0

私は – Virat

+0

が@Sandeshaそうすることができますネイティブクエリでページング可能オブジェクトを使用することができます動作しますが、あなたはこのようなカウントクエリを定義する必要があります@クエリー(値= "SELECT * WHERE LASTNAME =?1"から、 countQuery = "ユーザーからのSELECTカウント(*)LASTNAME =?1"、 nativeQuery = true) – lucid

+0

私は決してPageableを使用していません。私のクエリでどのように使用するのですか?助けてください – Virat

0

これは、インデックス値に基づいて異なるクエリを実行することで実現できます。

編集:あなたの結果セットにInteger.MAX_VALUE

未満の場合、このハックを試してみて、
@Query("select distinct tp.* from kat_task_property tp inner join kat_task_to_workstream ttw on ttw.ttw_frn_task_id = tp.tp_frn_task_id and ttw.ttw_frn_workstream_id= :workStreamId and ttw.ttw_ended_by is null and tp.tp_ended_by is null and tp.tp_is_active=true and ttw.ttw_is_active=true left join kat_user_to_task_order kto on ttw.ttw_id = kto.uto_frn_task_to_workstream_id and kto.uto_frn_user_id = :userId and order by tp.tp_completed_at, kto.uto_order") 
Page<T> findTp(Pageable pageable); 

PagingAndSortingRepository<YourObject, Long> repository = // … get access to a bean 
if(index == 0) 
    Page<YourObject> yourObject= repository.findTp(new PageRequest(index, Integer.MAX_VALUE)); 
else 
    Page<YourObject> yourObject= repository.findTp(new PageRequest(index, size)); 
+0

返される行だけが必要なため、最初のクエリではNULL条件がtp_completed_atに追加されました – Anurag

+0

しかし、2つの別々のクエリを使用することはできません。たいてい、私はtp_completed_atによって互いに隣接するすべてのヌル値を取得することができます – Virat

関連する問題