QueryDSL GROUP_CONCAT

정예진·2025년 2월 12일
0

지난글에 이어지는 QueryDSL에서 GROUP_CONCAT 쓰는법 입니다.

문제 상황

기존의 Repository에

COALESCE(GROUP_CONCAT(ri.rental_price ORDER BY ri.rental_price ASC SEPARATOR ','), '') AS price_list

로 작성한 부분을 DSL 방식으로 변경하는데 Hibernate에서는 GROUP_CONCAT을 지원하지 않이 때문에

java.lang.IllegalArgumentException: No pattern found for GROUP_CONCAT

과 같은 에러가 발생하는것을 볼 수 있었다.


사용방법(stringTemplate)

  • stringTemplate()은 QueryDSL에서 직접적으로 지원하지 않는 SQL 함수를 호출할 수 있도록 해준다.
Expressions.stringTemplate("GROUP_CONCAT({0}) ", rentalOption.rentalPrice).as("priceList")))

와 같이 Expressions.stringTemplate으로 내부에 내가 실행하기 원하는 SQL문을 작성하고 .as()를 사용해서 별칭을 지정해주면 되는 방식인데,

처음에는

GROUP_CONCAT({0} ORDER BY {0} ASC SEPARATOR ',')

내부에 이렇게 작성했더니 ORDER BY 를 할 수 없다는 오류가 발생했다...
아마 order by 도 지원하지 않는것 같았다..

두번째

GROUP_CONCAT({0} SEPARATOR ',')

이렇게 작성했더니 SEPARATOR를 사용할 수 없다는 오류가 발생했다.
여러가지의 참고자료를 찾아봐도 다들 SEPARATOR는 사용이 안되는 것 같다는 결론이 나오길래
SEPARATOR를 포기했지만 유레카하게도 자동으로 ,로 연결되어서 출력되고 있었다!!!

"priceList": "50000,20000"


추가

(근데 사실 그 사이에 발생한 오류가 하나 더 있었다.)

GROUP_CONCAT은 그룹화된 결과를 처리하는 집계 함수이므로 productPrice.productNo로 그룹화할 필요 하다는걸 간과했다...

.where() 아래에 .groupBy(productPrice.productNo) 을 추가하여 해결했다!

profile
저의 과정을 기록하고 있습니다!

0개의 댓글