Querydsl을 이용한 group_concat 사용하기

일반 설정으로 querydsl에서 group_concat을 사용할 수 없다.
group_concat을 사용하기 위해서는 mysql dialect를 customize해야한다.


mysql 버전에 따라 다르지만 필자는 mysql8 버전을 사용하고 있다.
따라서 database-platform을 org.hibernate.spatial.dialect.mysql.MySQL8SpatialDialect 클래스를 사용하고 있다. 이 클래스를 상속해서 다음과 같이 설정을 추가하면된다.


public class Mysql8CustomDialect extends MySQL8SpatialDialect {
    public Mysql8CustomDialect() {
        super();
        registerFunction("group_concat", new StandardSQLFunction("group_concat", StandardBasicTypes.STRING));
    }
}


그리고 나서 application.yml의 database-platform 설정 부분에 위에서 작성한 클래스의 패키지까지 작성한다.

spring:
  ...
  jpa:
    ...
    database-platform: com.example.querydsl.config.Mysql8CustomDialect
    ...


이제 설정은 끝났다. 이제 repository로 이동하여 querydsl에서 사용하면된다.
Expressions.stringTemplate을 이용하여 사용하면된다.

사용예시)

queryFactory
        .select(fruit.type, Expressions.stringTemplate("group_concat({0})", fruit.name))
        .from(fruit)
        .groupBy(fruit.type)
        .fetch()


참고 사이트
1) JPA + Querydsl group_concat 사용법