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
반응형
'Spring & Spring Boot' 카테고리의 다른 글
[ Spring-Boot ] Data - JPA 사용하기 (0) | 2021.06.14 |
---|---|
Spring Cloud Netflix - Eureka (0) | 2021.06.11 |
[ Spring-Boot ] JPA Embedded 타입 사용하기 (0) | 2021.05.23 |
[ Spring-Boot ] JPA Entity 사용하기 (0) | 2021.05.23 |
[ Spring-Boot ] JPA @GeneratedValue 사용하기 (0) | 2021.05.22 |