2017-08-09 5 views
3

私は、順番に、春のリポジトリで使用する春のページング可能を作成します。PAGEおよびSIZEパラメータCallbaсkDataProviderは、ページング可能ページへのオフセットとリミットの変換やサイズ

/fetchrecords?page=0&size=10 

を受け入れ、既存のRESTサービスを持っています

Pageable pageRequest = new PageRequest(page, size, Sort.Direction.DESC, "created"); 

しかし私はそれがOFFSETとLIMITはBackendDataProviderのために使用されるように生成し、今Vaadin 8 CallbackDataProviderを使用します。

dataProvider = new CallbackDataProvider<MyPojo, Void>(
        query -> service.fetchrecords(query.getOffset(), query.getLimit()).stream(), 
        query -> service.getCount()); 

もちろん、これはoffset!= pageとして機能しません。また、オフセット値に基づいて、残っているレコード数に基づいて制限値が変更されます。

残り/サービスを書き直さずに、DataProviderのOFFSETとLIMITからPAGEとSIZEに正しく移動するにはどうすればよいですか?

+1

(これはあなたにpageSizeを与える)からオフセットを減算してから、pageSize(ページ)でオフセットを除算することができます。 – ByeBye

+0

@ByeByeオフセットが正確にページの先頭にない場合はどうなりますか? –

+0

@ByeBye Vaadin DataProviderは、コンポーネント(グリッド)をスクロールするときに常に制限とオフセットを変更するため、直接ページ/サイズを基にすることが信頼できないと思われます。 – steve

答えて

2

私は同じ問題を抱えていました。オフセットとリミットを持つVaadinページングは​​、ページとページサイズのページング(RESTサービスやSpringクラスPageRequestなど)よりも強力です。だから、あなたの質問に対する答えは、あなたは簡単にはできません。あなたはオフセットと制限するために、あなたのRESTサービスパラメータを変更することができれば、あなたのような独自のPageable実装することができます:

public class Range implements Pageable, Serializable { 

    private static final long serialVersionUID = 0L; 

    private int limit; 
    private long offset; 
    private Sort sort; 

    public Range(long offset, int limit, Sort sort) { 
     ... 
    } 

    @Override 
    public long getOffset() { 
     return offset; 
    } 

    ... 

} 

を、これはすぐに使用できない理由を私は疑問に思います。

もう1つの方法として、必要な範囲のデータを含む複数のページにオフセット/リミットをマップし、これらのページを取得して必要なデータだけを取り出す方法があります。

+3

ページング可能な実装の完全な実例[here](https://stackoverflow.com/a/36365522/474287) – Morfic

+0

@forfic、ありがとうございます。私はCustom Pageableに遭遇しましたが、他のすべてのものがPage、Sizeを現在使用しているので、私のサービスを変更することから離れようとしていました。他のオプションがない場合は、私はAPI /サービスでオフセットとリミットをサポートする必要があります – steve

+1

他のオプションは、オフセット/リミット範囲を複数のページにマップし、それらを取得して必要なデータのみを取り出すことです。もちろん、これは何とかリソースの無駄です:) –

関連する問題