지난글에 이어지는 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
과 같은 에러가 발생하는것을 볼 수 있었다.
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) 을 추가하여 해결했다!