私の視点から:
- 各リクエストは、基本的にオフセットとページ サイズを保持するリクエスト オブジェクトにカプセル化できます。
- 各応答は、基本的に結果リストと合計を持つ応答オブジェクトにカプセル化できます。代わりに、応答の構築に使用される要求オブジェクトを保持することもできます。
データベースで選択を実行するためのインターフェイスは次のようになります。
public PageResponse getPage(PageRequest pageRequest);
このアプローチにより、ページング メソッドの拡張が容易になります。数か月後に、そのメソッドに並べ替えを実装する必要があると想像してください。各呼び出しを変更する必要があります。このアプローチでは、PageRequest
オブジェクトを変更してデフォルトの並べ替えを指定します。何も壊れることはなく、本当に必要な呼び出しで並べ替えをカスタマイズできます。
このメソッド内で、2 つの異なるデータベースの選択が必要になります。
- 1 つは選択リスト (応答によって保持され、プロパティ resultList を介してアクセスされるリスト) を取得するためのものです。これは、各データベースに固有の機能を使用して結果セットを制限することで実行できます (
top
sybase の場合limit
、mysql および PG の場合、rownum
Oracle では、これはデータベースごとに異なります)。
- ビッグデータセットの場合にデータのページングを実行するために、ページングなしで選択されたレコードの合計を取得する別のもの。
あなたの問題の良い参考文献はSpring Dataです。それらには多かれ少なかれ必要なものであるPageとPageRequestがあります。おそらく、彼らの API を使用してソリューションを実装できます。
実際には、リクエスト オブジェクトは次のようになります。
public class PageRequest {
private int offset;
private int pageSize;
// getters and setters and convenience constructors with the given fields
}
public class PageResponse {
private List<?> resultList;
private int total;
// getters and setters and convenience constructors with the given fields
}
もちろん、ジェネリックを少し使って、既に要求した型を保持する応答を持たせることもできます。これにより、次のような応答オブジェクトの使用が容易になります。
public <T> PageResponse<T> getPage(PageRequest<T> pageRequest);
次のような Request と Response のオブジェクトを持つ:
public class PageRequest<T> {
private int offset;
private int pageSize;
// getters and setters and convenience constructors with the given fields
}
public class PageResponse<T> {
private List<T> resultList;
private int total;
// getters and setters and convenience constructors with the given fields
}