본문 바로가기

Programming!

Spring Data JPA + QueryDSL에서 커스텀 DTO사용시 groupby, count

Spring Data JPA + QueryDSL에서 커스텀 DTO사용시 groupby, count()를 사용하다보면 의도치 않은 오류인..

"Unsupported expression count(..)" 요놈을 만나게 된다. 물론 sum이든 뭐든..

 

예로,

 

검색어를 저장하는 entity table이 아래와 같다고 해보자.

 

id, keyword

 

그럼 이놈을 목록으로 보여줄때 keyword는 group으로 묶어주고 해당 키워드의 카운트를 보고 싶을 경우

 

"select keyword, count(keyword) from keywords group by keyword" 뭐 이런 형태가 될 것이고, entity는 커스텀 dto를 쓰게 된다.

@Data
@NoArgsConstructor
@AllArgsConstructor
public class KeywordDto {
    private String keyword;
    private Long count;
}



*참고..아래처럼 해도 무관.

...

@QueryProjection public KeywordDto(String keyword, Long count){ ... }

...

 

그리고 repository 구현체에서는 대게 다음처럼 쓴다.

    @Override
    public List<KeywordDto> findStatistics() {
        QKeyword qKeyword = QKeyword.keyword;
        return from(qKeyword).groupBy(qKeyword.word).list(
            Projections.bean(KeywordDto.class, qKeyword.word, qKeyword.word.count()));
    }

 

이때 바로 "Unsupported expression count(..)"이 오류가 뜬다.. 이유는 저 count()가 매핑 될 속성을 지정 받지 않았기 때문이다.

...

Projections.bean(KeywordDto.class, qKeyword.word, qKeyword.word.count().as("count"))..

위의 처럼 count()다음에 .as(alias name)을 넣어주면 문제 없이 실행된다.