実施形態の方法


Paginationとは?


上記のUI要素を「ページネーミング」と呼びます.多くのデータ・リストは、一度にロードおよび表示するのが難しいため、その一部のみを取得して表示できます.このため、データベースに格納されているデータを切り取ることを「ページング」と呼びます.
ページ番号
「1ページあたり出力するデータ数」
「画面下部に印刷するページサイズ」
キーワードの検索
検索タイプ
などなど.
ページ名に必要な情報は非常に多い場合があります.しかし,この論文では,ページ番号(page)と,1ページ当たりの出力データ数(size)のみを考慮したページングについて論じる.

どのように実現しますか?


もちろん、データベースからすべてのデータ(select*from table)を取得し、メモリで順番に切断し、希望するデータのみを選択できますが、説明するページング方法は、データベースで希望するデータのみをクエリーすることです.
方法は本当に多様だ.しかし、この投稿は筆者が理解した内容だけを記録している.
1.クエリーを直接作成して飛ばす
2.Spring-Data-JPAの使用

LIMITを使用したクエリーの直接作成(mysql)


MySQLでは、LIMIT構文は、データが欲しいだけデータを取得するために使用されます.
LIMITの最初のパラメータは開始位置を指定し、2番目のパラメータはインポートするデータの個数を指定します.
  • limit 3,2:3第3のデータから2つ(第3、第4のデータ)
  • を取得する.
    したがって、私たちが望んでいるデータはLIMIT (page-1)*size, sizeです.
    すなわち、pageおよびsizeが与えられたときにSELECT * FROM table LIMIT (page-1)*size, sizeクエリが発行されると、必要なデータのみが抽出される.

    page=5、size=10のクエリ例
    (springサーバでin-memory h 2 dbを解放し、コンソールに直接入力します.)

    Spring Data Jpaの使用


    Spring Data Jpaの使用
  • Pageableオブジェクトを使用すると、ページング情報を簡単に管理できます.
  • JPAクエリーメソッドのパラメータを使用してPageableを渡すと、クエリーを簡単にDBに送信できます.
  • (見ていて気持ちがいいということです)

    Pageableとは?(ft. PageRequest)


    インターフェイス!
    Spring Data Jpaで定義されている転送可能なインタフェースには、次の簡単な説明があります.

    これはPageableがPagination要求情報を含む抽象インタフェースであることを意味する.実際に使用するためには、実施体が必要で、もちろん準備ができています.
  • 類QpageRequest:QueryDSL用パッケージング可能なインプリメンテーション
  • クラスPageRequest:最も基本的なパッケージング可能なインプリメンテーション
  • enum Unpaged:ページング情報のないインプリメンテーションを表すために使用される.INSTANCEを所有
  • その中で最も基本的なPageRequestが最も多く使われています.
    (実はこれもめんどくさいし、スプリング製作の道具もあるので、これも結構…)

    クエリメソッドとともに書き込み


    Pageとsize情報を使用して折り畳み可能なオブジェクトを作成したとしたら、クエリーメソッドとともに使用しましょう.
    JPA RepositoryとCrudRepositoryの間のPaging And Sorting Repositoryでは、Pageableをパラメータとする方法が宣言されている.
  • Page findAll(Pageable pageable)
  • (PageはPaginationに必要な情報の対象です.要求されたデータのほか、完全なページインデックス、現在のページ番号など複数の付加情報が含まれています.)
    これはJpa Repositoryが継承し、これも私たちのCustom Repositoryが継承して使用します.
    //User 테이블을 페이징하는 메서드
    @Repository
    public interface UserRepository extends JpaRepository<User, Long> {
        Page<User> findAll(Pageable pageable);
    }
    (メソッド定義はorg.springframework.data.jpa.repository.support.SimpleJpaRepository.javaで......ああ)

    要求からPageableオブジェクトを作成


    やっとPageableオブジェクトを直接作成できるようになりました
    クエリー・パラメータがpageとsizeの場合、次の方法でページング可能なオブジェクトを作成できます.
    protected PageRequest(int page, int size, Sort sort) {
    	super(page, size);
    	Assert.notNull(sort, "Sort must not be null!");
    	this.sort = sort;
    }
    
    public static PageRequest of(int page, int size) {
    	return of(page, size, Sort.unsorted());
    }
    
    public static PageRequest of(int page, int size, Sort sort) {
    	return new PageRequest(page, size, sort);
    }
    
    public static PageRequest of(int page, int size, Direction direction, String... properties) {
    	return of(page, size, Sort.by(direction, properties));
    }
  • PageReqeust.page、size、sortを必要に応じてof()というメソッドに渡し、作成します.
  • // 사용 예시
    Page<Entity> pleaseGiveMePages(int page, int size) {
    	Pageable pageable = PageRequest.of(page,size);
        	Page<Entity> page = entityRepository.findAll(pageable);
            return page;
    }

    もっと知っていればもっといいです。

  • ソート方法(sortをスキップする方法)
  • Pageオブジェクトの構成
  • コントローラからパラメータとしてPageableを取得する方法(ft.@PageableDefault)
  • インデックス最適化