JPAページング/ソート処理SpringBootの使用
21045 ワード
📚 勉強した本:コード学習を用いたSpring Boot Webプロジェクト
1.ページング処理の方法
JPAは、開発者がSQLではなくAPIのオブジェクトとメソッドでページング処理を行うのを支援します.
findAll()メソッドはparepositoryインタフェースの親PagingAndSortRepossitoryメソッドであり、Pageableという名前のオブジェクトによって実行されるパラメータによって渡されるクエリ
2.ページング処理用インタフェース
ページングを処理する上で最も重要なのはorgです.springframework.data.domain.Pageableインタフェース
->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)
Reference
この問題について(JPAページング/ソート処理SpringBootの使用), 我々は、より多くの情報をここで見つけました
https://velog.io/@alswl689/SpringBoot-with-JPA-페이징정렬처리
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
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);
}
}
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
ページング処理を担当する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)
Reference
この問題について(JPAページング/ソート処理SpringBootの使用), 我々は、より多くの情報をここで見つけました https://velog.io/@alswl689/SpringBoot-with-JPA-페이징정렬처리テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol