Spring & Spring Boot

[ Spring-Boot ] JPA QueryDsl 정렬 사용하기

사과씨앗 2021. 5. 23. 17:48
728x90
반응형

안녕하세요 이번 글에서는 QueryDsl 사용 시 정렬(ORDER BY)을 사용하여 보겠습니다.

 

 

@Service ( @Controller , View는 생략하겠습니다. )

 public Page<Board> getBoardSearchList(int page, BoardSearch boardSearch) {
        //페이징 조건과 정렬 조건을 같이 보내 준다.
        PageRequest pageRequest = PageRequest.of(page, 15, Sort.by(Sort.Direction.fromString(boardSearch.getOrderBy()), boardSearch.getSort()));
        return boardQuerydslRepository.getSearchBoardList(pageRequest, boardSearch);
    }

 

컨트롤러에서 보내준 페이징 조건 및 정렬 기준을 PageRequest에 인자로 넣어줍니다.

 

* PageRequest.of(첫 번째, 두 번째, 세 번째)

 

- 첫 번째 인자 : 현재 페이지

 

- 두 번째 인자 : 페이지의 사이즈

 

- 세 번째 인자 : 정렬 기준 등록

       

여기서 세 번째 인자로 사용될  Sort.by()  인자로 정렬 방향과 정렬 조건을 넣어 줍시다.

 

내림차순 : Sort.Direction.DESC

오름차순 : Sort.Direction.ASC

String 값 : Sort.Direction.fromString( String 문자열 )

 

Sort.by()  두 번째 인자로 정렬 조건을 넣어 주면 됩니다.

 

 

@Repository

/**
     * 메인보드 검색조건으로 검색
     *
     * @param page
     * @param boardSearch
     */
    public Page<Board> getSearchBoardList(Pageable page, BoardSearch boardSearch) {

        QueryResults<Board> boardQueryResults = query
                .select(board)
                .from(board)
                .join(board.member, member)
                .where(
                        searchEq(boardSearch)
                ).offset(page.getOffset())
                .limit(page.getPageSize())
                .orderBy(boardSort(page))
                .fetchResults();
        List<Board> content = boardQueryResults.getResults();
        long total = boardQueryResults.getTotal();
        return new PageImpl<>(content, page, total);
    }

 

orderBy 부분에 들어갈 boardSort() 메서드를 만들어 줍니다.

 

/**
     * OrderSpecifier 를 쿼리로 반환하여 정렬조건을 맞춰준다.
     * 리스트 정렬
     * @param page
     * @return
     */
    private OrderSpecifier<?> boardSort(Pageable page) {
        //서비스에서 보내준 Pageable 객체에 정렬조건 null 값 체크
        if (!page.getSort().isEmpty()) {
            //정렬값이 들어 있으면 for 사용하여 값을 가져온다
            for (Sort.Order order : page.getSort()) {
                // 서비스에서 넣어준 DESC or ASC 를 가져온다.
                Order direction = order.getDirection().isAscending() ? Order.ASC : Order.DESC;
                // 서비스에서 넣어준 정렬 조건을 스위치 케이스 문을 활용하여 셋팅하여 준다.
                switch (order.getProperty()){
                    case "title":
                        return new OrderSpecifier(direction, board.title);
                    case "content":
                        return new OrderSpecifier(direction, board.content);
                    case "member":
                        return new OrderSpecifier(direction, board.member.memberName);
                    case "createdDate":
                        return new OrderSpecifier(direction, board.createdDate);
                    case "likeCount":
                        return new OrderSpecifier(direction, board.likeCount);
                }
            }
        }
        return null;
    }

 

위 코드처럼 OrderSpecifier 객체에 정렬 조건을 담아서 쿼리의 Order By 부분에 반환하여 주면 됩니다.

 

728x90
반응형