알아볼 인터페이스 두개
인터페이스 | 특징 |
Pageable (매개변수) | 요청 페이징 객체 |
Page (리턴값) | 결과 페이징 객체 |
두가지 버전이 있다
쿼리 메소드를 사용한 예제와
@Query 를 사용한 예제
< 1 >
쿼리 메소드를 사용한 예제 1번
import
EmpRepository
( 사원 레파지토리 )
// 1) 쿼리 메소드 : 함수명으로 sql 문 실행하기
// 1-1) Ename Like 검색
public Page<Emp> findAllByEnameContaining(String ename , Pageable pageable) {
Page<Emp> page = empRepository.findAllByEnameContaining(ename ,pageable);
return page;
}
EmpService
public Page<Emp> findAllByEnameContaining(String ename , Pageable pageable) {
Page<Emp> page = empRepository.findAllByEnameContaining(ename ,pageable);
return page;
}
EmpController
( Map 에 집어 넣어 보낸다. )
/**
* --------------------------
* 페이징 처리 예제
* -------------------------
*/
@GetMapping("/emp/ename/{ename}/paging")
public ResponseEntity<Object> findAllByEnameContaining(@PathVariable String ename, Pageable pageable) {
try {
Page<Emp> page = empService.findAllByEnameContaining(ename, pageable);
Map<String, Object> map = new HashMap<>();
map.put("emp", page.getContent()); // Emp 클래스 가져오기
map.put("currentPage", page.getNumber()); // 현재 페이지 가져오기
map.put("totalItems", page.getTotalElements()); // 전체 테이블 수 가져오기
map.put("totalPages", page.getTotalPages()); // 전체 페이지 수 가져오기
if (page.isEmpty() == false) {
return new ResponseEntity<>(map, HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
} catch (Exception e) {
log.debug(e.getMessage());
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
예제 검색은?
// page = 현재페이지 번호(0 ~ n) , size = 전체페이지 수
###
GET http://DOMAIN/emp/ename/S/paging?page=0&size=3
GET http://DOMAIN/emp/ename/L/paging?page=1&size=2
< 2 >
쿼리 메소드를 사용한 예제 2번
기본 제공되는 전체 조회 함수 findAll
에 페이징처리 기능을 추가해보겠다.
findAll 은 기본 제공이 되기에 Repository를 작성할 필요가 없다
DeptService
// TODO: 페이징 예제 2번
// 기본 제공되는 전체 조회 함수 : 페이지처리 기능 추가
public Page<Dept> findAll(Pageable pageable) {
Page<Dept> page = deptRepository.findAll(pageable);
return page;
}
DeptController
// TODO : 페이징예제 2번 findAll() + 페이징 : @Query
@GetMapping("/dept/all/paging")
public ResponseEntity<Object> getDeptDnamePage(Pageable pageable) {
try {
Page<Dept> page
= deptService.findAll(pageable);
// todo: Map 자료구조 정보 저장 : 1) 부서객체, 2) 페이징 정보 (3개)
Map<String, Object> response = new HashMap<>();
response.put("dept", page.getContent()); // 부서 객체
response.put("currentPage", page.getNumber()); // 현재페이지번호
response.put("totalItems", page.getTotalElements()); // 전체테이블건수
response.put("totalPages", page.getTotalPages()); // 전체 페이지 수
if (page.isEmpty() == false) {
// 성공
return new ResponseEntity<>(response, HttpStatus.OK);
} else {
// 데이터 없음
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
} catch (Exception e) {
log.debug(e.getMessage());
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
예제 검색은?
// page = 현재페이지 번호(0 ~ n) , size = 전체페이지 수
###
GET http://DOMAIN/dept/all/paging?page=0&size=3
GET http://DOMAIN/dept/all/paging?page=1&size=2
< 3 >
@Query를 사용한 페이징 처리 예제
DeptRepository
( countQuery 를 추가해주어야 한다. )
// 2) @Query 를 이용한 페이징 처리
@Query(value = "SELECT D.* FROM TB_DEPT D " +
"WHERE D.DNAME LIKE '%' || :dname || '%'"
, countQuery = "SELECT COUNT(D.*) FROM TB_DEPT D "
,nativeQuery = true)
Page<Dept> selectByDnamePage(@Param("dname") String dname, Pageable pageable);
DeptService
// TODO : 페이징 예제 3번 : @Query 어노테이션
public Page<Dept> selectByDnamePage(String dname, Pageable pageable) {
Page<Dept> page = deptRepository.selectByDnamePage(dname, pageable);
return page;
}
DeptController
// TODO : 페이징 처리 예제 3번 : @Query 어노테이션
@GetMapping("/dept/dname/{dname}/paging/query")
public ResponseEntity<Object> selectByDnamePage(@PathVariable String dname, Pageable pageable) {
try {
Page<Dept> page
= deptService.selectByDnamePage(dname , pageable);
// todo: Map 자료구조 정보 저장 : 1) 부서객체, 2) 페이징 정보 (3개)
Map<String, Object> response = new HashMap<>();
response.put("dept", page.getContent()); // 부서 객체
response.put("currentPage", page.getNumber()); // 현재페이지번호
response.put("totalItems", page.getTotalElements()); // 전체테이블건수
response.put("totalPages", page.getTotalPages()); // 전체 페이지 수
if (page.isEmpty() == false) {
// 성공
return new ResponseEntity<>(response, HttpStatus.OK);
} else {
// 데이터 없음
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
} catch (Exception e) {
log.debug(e.getMessage());
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
예제 검색은?
###
GET http://DOMAIN/exam01/dept/dname/{{dname}}/paging/query
'SpringBoot > JPA' 카테고리의 다른 글
SpringBoot - JPA - 1 대 1 관계 (0) | 2023.10.19 |
---|---|
SpringBoot - JPA - 조인 ( 1 대 다 관계 ) (0) | 2023.10.19 |
SpringBoot - JPA - 쿼리 메소드와 @Query 어노테이션 (0) | 2023.10.17 |
SpringBoot - JPA - Repository (인터페이스) (0) | 2023.10.16 |
SpringBoot - JPA - Entity class (1) | 2023.10.16 |