SpringDataJPA의 정렬 기능
extends JpaRepository<CafeBookmark, Long>
- DataJPA의 JpaRepository는 PagingAndSortingRepository<T, ID>를 상속받고 있어 페이징과 정렬이 가능하다
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
}
카페에 북마크 기능을 추가한 후 북마크 많은 순 정렬을 추가하기 위한 작업을 진행중 북마크 개수를 통한 정렬 데이터를 가져오기 위해선
Cafe 테이블과 Bookmark 테이블을 join하고 group by를 사용한 뒤 count 함수를 이용하여 정렬해야하는데 단순히 Sort.by의 속성 인자만으로는 이를 구현할 수 없었습니다.
-> Sort.by의 속성 인자로 bookmark를 넣을 경우 최근 등록된 북마크가 있는 카페 순으로 정렬되어 이 방법도 원하는 값을 도출해내지 못함.
해결방법
후보 1.
@Query 어노테이션을 활용하여 JPQL을 통해 구현하는 방법이 있지만 이렇게 되면 전략패턴을 통해 구현해 놓은 Sort 전략을 사용할 수 없는 문제점이 발생하였습니다.
후보 2. ★★★★★
기깔나는 해결방법 : @Formula 어노테이션 사용!Cafe 클레스에 Formula 어노테이션을 선언한 변수를 만들면 해당 쿼리를 실행하여 그 값을 변수에 반환해주는 신박한 코드를 발견!!!@@
@Formula("(select count(*) from cafe_bookmark where cafe_bookmark.cafe_number=cafe_number)")
private int cafeBookmarkCount;
-> 이 방법을 사용하면 기존의 코드에 영향을 주지않고 원하는 값만 도출해낼 수 있어 너무너무 좋은 코드!
-> 이 값을 테이블의 컬럼명처럼 넣어 Sort.by에서 사용합니다
Sort.by(Sort.Direction.DESC, "cafeBookmarkCount");
'프로그래밍 > JPA Project - sparta' 카테고리의 다른 글
북마크 기능 (0) | 2022.08.17 |
---|---|
전략 패턴 리팩토링 - Sort (0) | 2022.07.28 |
tip. 인텔리제이 Local History 기능 (0) | 2022.07.27 |
다른 사용자의 데이터 접근 불가 처리 (0) | 2022.07.26 |
springboot 배포 timezone 동기화 문제 해결 방법 (0) | 2022.07.25 |