JPAページング/ソート処理SpringBootの使用



📚 勉強した本:コード学習を用いたSpring Boot Webプロジェクト

1.ページング処理の方法


JPAは、開発者がSQLではなくAPIのオブジェクトとメソッドでページング処理を行うのを支援します.
  • ページングおよびソートの方法:findAll()
    findAll()メソッドはparepositoryインタフェースの親PagingAndSortRepossitoryメソッドであり、Pageableという名前のオブジェクトによって実行されるパラメータによって渡されるクエリ
  • を決定する

    2.ページング処理用インタフェース


    ページングを処理する上で最も重要なのはorgです.springframework.data.domain.Pageableインタフェース
  • PageRableインタフェースは、ページの処理に必要な情報を伝達するためのインタフェースであるため、実際のオブジェクトを生成する際に、実装チェーンPageRequestというクラスが使用される
    ->PageRequestクラスの作成者がProtectedと宣言し、newは使用できません.オブジェクトを作成するにはstatic hand of()を使用して
  • を処理します.

    3.表面処理試験コード


    次のコードの注意すべき部分は、リターンタイプがPageであることです.
    ->Pageタイプは、対応するリストを簡単にインポートするだけでなく、実際のページ処理に必要なすべてのデータの数を取得するためにクエリーを同時に処理します.
    import com.example.entity.Memo;
    import com.example.repository.MemoRepository;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.PageRequest;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.domain.Sort;
    
    
    @SpringBootTest
    public class MemberRepositoryTest {
    
        @Autowired
        MemoRepository memoRepository;
    
        @Test
        public void testPageDefault(){
    
            // 1페이지 10개
            Pageable pageable = PageRequest.of(0,10);
    
            Page<Memo> result = memoRepository.findAll(pageable);
    
            System.out.println(result);
    
        }
    }
    

    上のテストコードを実行すると、次のSQLが実行されます。


    PageableタイプのパラメータをfindAll()に渡すと、ページング処理に関連するクエリーが実行され、これらの結果を使用してタイプで指定されたPage<エンティティタイプ>オブジェクトを返すように格納されます.
    Hibernate: 
        select
            memo0_.mno as mno1_0_,
            memo0_.memo_text as memo_tex2_0_ 
        from
        	// limit : MySql에서 페이징 처리에 사용하는 limit구문 
            tbl_memo memo0_ limit ?
    Hibernate: 
        select
        	// count() : 전체 개수를 처리한다
            count(memo0_.mno) as col_0_0_ 
        from
            tbl_memo memo0_
    Page 1 of 10 containing com.example.entity.Memo instances

    4.テストコードのソート


    ページング処理を担当するPageRequestは、ソートに関連するSortタイプをパラメータとして渡すことができます.
    ->Sortは、1つ以上のフィールド値を使用して順序ソート(asc)または逆順序ソート(desc)を指定できます.
    Sortのand()を使用して、異なるソート条件を指定することもできます.
    import com.example.entity.Memo;
    import com.example.repository.MemoRepository;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.PageRequest;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.domain.Sort;
    
    
    @SpringBootTest
    public class MemberRepositoryTest {
    
        @Autowired
        MemoRepository memoRepository;
    
        @Test
        public void testPageDefault(){
    
             // 정렬
            Sort sort = Sort.by("mno").descending();
            
            Sort sort2 = Sort.by("memoText").ascending();
            
            Sort sortAll = sort.and(sort2); // and를 이용한 연결
            
        
            // 1페이지 10개
            Pageable pageable = PageRequest.of(0,10,sort);
    
            Pageable pageable2 = PageRequest.of(0,10,sortAll);
    
            Page<Memo> result = memoRepository.findAll(pageable);
    
            Page<Memo> result2 = memoRepository.findAll(pageable2);
    
            System.out.println(result);
    
            result.get().forEach(memo -> {
                System.out.println(memo);
            });
    
            System.out.println(result2);
            result2.get().forEach(memo -> {
                System.out.println(memo);
            });
    
        }
    }
    

    上記のページングクエリとは異なりorderbyが使用されていることを確認できます。

    Hibernate: 
        select
            memo0_.mno as mno1_0_,
            memo0_.memo_text as memo_tex2_0_ 
        from
            tbl_memo memo0_ 
        order by
            memo0_.mno desc limit ?
    Hibernate: 
        select
            count(memo0_.mno) as col_0_0_ 
        from
            tbl_memo memo0_
    Page 1 of 10 containing com.example.entity.Memo instances
    ---------------------------------------------------------------
    // and 사용한 쿼리
    Hibernate: 
        select
            memo0_.mno as mno1_0_,
            memo0_.memo_text as memo_tex2_0_ 
        from
            tbl_memo memo0_ 
        order by
            memo0_.mno desc,
            memo0_.memo_text asc limit ?
    Hibernate: 
        select
            count(memo0_.mno) as col_0_0_ 
        from
            tbl_memo memo0_
    Page 1 of 10 containing com.example.entity.Memo instances

    ☆ソート結果

    Memo(mno=100, memoText=Memo...100)
    Memo(mno=99, memoText=Memo...99)
    Memo(mno=98, memoText=Memo...98)
    Memo(mno=97, memoText=Memo...97)
    Memo(mno=96, memoText=Memo...96)
    Memo(mno=95, memoText=Memo...95)
    Memo(mno=94, memoText=Memo...94)
    Memo(mno=93, memoText=Memo...93)
    Memo(mno=92, memoText=Memo...92)
    Memo(mno=91, memoText=Memo...91)