JPA_ Page findAll(Pageable pageable) 함수

김지영·2024년 3월 19일

jpa

목록 보기
4/18
post-thumbnail

-DeptRepository : 레포지토리 클래스 : DB CRUD 함수가 있는 인터페이스

1. 페이징 처리 + Like 검색어

① Like 검색 SQL 문 작성

-> 복사할 때는 세미콜론 빼고 복사함!

◈ 사용법

@Query(value="sql 문", nativeQuery=true)
  • @Param("매개변수명")
    : sql 문 속으로 함수의 매개변수값을 전달하기 위한 어노테이션
  • select ~ where 컬럼명 like
    : 매개변수명 : 함수매개변수 == :매개변수 (일치)
  • Page<엔티티>객체
    : 페이징된 결과값을 저장할 객체(함수의 리턴값으로 사용)
    예) 속성 : 현재페이지번호, 전체페이지건수 등
  • Pageable 객체
    : 페이징하기 위한 객체(함수의 매개변수로 사용)
  • JPA @Query 옵션
    : nativeQuery=true[false]
    1) nativeQuery=true : 오라클 sql 문 사용가능
    2) nativeQuery=false : 객체 sql 문(JPQL) 사용해야함(참고) , 생략가능

② 페이징 처리 : 테이블 개수 세기 sql문 추가로 들어가야함

-> 복사할 때는 세미콜론 빼고 복사함!

 countQuery = "SELECT count(*) FROM TB_DEPT D\n" +
            "WHERE D.DNAME LIKE '%'|| :dname ||'%'"



3. like 검색 함수 : 페이징 처리

->DeptService

    public Page<Dept> findAllByDnameContaining(String dname,
                                               Pageable pageable) {
//      DB like 검색 함수 실행 : 페이징 처리
        Page<Dept> page
                = deptRepository
                .findAllByDnameContaining(dname, pageable);
        return page;
    }


->DeptController
☆ 전체 조회 + like 검색 + 페이징 처리

@Slf4j
@Controller
@RequestMapping("/basic")
public class DeptController {

    //    서비스 클래스 가져오기
    @Autowired
    DeptService deptService;

    //    전체 조회 + like 검색 + 페이징 처리
//    복습 : 매개변수 전달 방식 : 1) 쿼리스트링   : @RequestParam
//                             2) 파라메터방식 : @PathVariable
    @GetMapping("/dept")
    public String getDeptAll(
            @RequestParam(defaultValue = "") String dname,
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "3") int size,
            Model model) {
//        TODO: 페이징 처리 객체에 값 저장 : Pageable
//            1) 현재페이지번호  : page
//            2) 1페이지 당 개수 : size
        Pageable pageable = PageRequest.of(page, size);
//        TODO: DB like 검색 서비스 함수 실행
        Page<Dept> pageRes
                = deptService
                .findAllByDnameContaining(dname, pageable);
                
//        Page 객체에는 굉장히 많은 속성이 있음 : 현제페이지 번호 등
//        자바 자료구조(컬렉션프레임워크) : List, Map<키, 값>

//        결과를 jsp 전송
       
    }
}
  • Page 객체에는 굉장히 많은 속성이 있음 : 현제페이지 번호 등
    자바 자료구조(컬렉션프레임워크) : List, Map<키, 값>
    jsp 로 보낼 정보 :
    1) 부서정보(배열)
    2) 현재 페이지 번호
    3) 전체 테이블 건수
    4) 전체 페이지 개수
    5) 블럭시작 페이지 번호
    6) 블럭 끝페이지 번호

-> 결과를 jsp로 전송

        model.addAttribute("dept",pageRes.getContent());  // 1)부서정보 배열
        model.addAttribute("currentPage",pageRes.getNumber());  // 2)현재 페이지 번호
        model.addAttribute("totalItems",pageRes.getTotalElements());  //  3)전체 테이블 건수
        model.addAttribute("totalPages",pageRes.getTotalPages());  //  4)전체 페이지 개수

//        공식 : 블럭 시작페이지 번호 = (Math.floor(현재페이지번호/1페이지당개수)) * 1페이지당개수 (:size)
        long blockStartPage = (long) Math.floor((double) (pageRes.getNumber())/size) *  size;
        model.addAttribute("startPage" , blockStartPage); //5) 블럭시작 페이지 번호

//        공식 : 블럭 끝페이지 번호 = 블럭 시작페이지번호 + 1페이자당개수 - 1
        long blockEndPage = blockStartPage * size - 1;
//         블럭 끝페이지 번호 !=  , > 전체페이지 번호   : 이 경우가 발생할 수 있음
//         블럭 끝페이지 번호 = 전체피이지 번호 (같게 값 보정)
        blockEndPage = (blockEndPage >= pageRes.getTotalPages())?pageRes.getTotalPages()-1:blockEndPage;
        model.addAttribute("endPage", blockEndPage);

        return "basic/dept/dept_all.jsp";

-> dept_all.jsp

        <c:forEach var="data" items="${dept}">

=> 반복문 dept 로 변경

-Add 버튼 추가

<%--        TODO: Add 버튼 --%>
    <div class="text-center">
        <a href="/basic/dept/addition" class="btn btn-primary">Add</a>
    </div>

- 페이지 번호 추가

(전체조회 컨트롤러 함수)

    <%--        TODO: 페이지번호 --%>
    <%--  복습 : class="d-flex justify-content-center" : 중앙정렬 --%>
    <div class="d-flex justify-content-center">
        <ul class="pagination">
            <%--          TODO: startPage   : 0부터 시작 (블럭 시작페이지번호)--%>
            <%--          TODO: endPage     : (블럭 끝페이지번호)--%>
            <%--          TODO: currentPage : 현재페이지번호 0부터 시작 --%>
            <%--        이전 버튼 : 시작페이지가 0이면 버튼 비활성화 아니면 활성화 --%>
            <li class="page-item ${(startPage+1==1)? 'disabled' : ''}">
                <a href="/basic/dept?page=${startPage-1}&size=${3}" class="page-link">이전</a>
            </li>
            <%--       TODO: 반복문으로 실행 --%>
            <%--        사용법 : <c:forEach var="data" begin="시작값" end="끝값">반복문</c:forEach>--%>
            <c:forEach var="data" begin="${startPage}" end="${endPage}">
                <li class="page-item"><a class="page-link" href="/basic/dept?page=${data}&size=${3}">${data+1}</a></li>
            </c:forEach>

            <%--        다음 버튼 : 끝페이지가 전체페이지와 같으면 비활성화 아니면 활성화 --%>
            <li class="page-item ${(endPage+1==totalPages)? 'disabled' : ''}">
                <a href="/basic/dept?page=${endPage+1}&size=${3}" class="page-link">다음</a>
            </li>
        </ul>
    </div>

(disabled : 비활성화)

profile
그냥 졍이라구하자

0개의 댓글