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");

 

 

+ Recent posts