JPA

QueryDsl QuerydslRepositorySupport에서 group_concat사용하기!

천천히올라가자 2019. 9. 1. 22:22
반응형

QuerydslRepositorySupport을 사용해서 querydsl을 사용하면 내부적으로 HqlTemplates를 사용하게 된다

참고로 QuerydslRepositorySupport이 아닌 다른 방식으로 querydsl을 사용할 경우에는 db에 맞게 template를 지정해 줄 수 있다

 

group_concat을 사용하려고 했을 때

No pattern found for GROUP_CONCAT; 에러가 발생하였다.

그래서 이유를 찾아보았더니

HQLTemplates로 인식한다 그래서 내가 templates를 선택할 수 있는 방법이 있을까 해서 소스를 더 찾아보았다

Querydsl class 안에 createQuery라는 것이 있었다 그런데...내가 선택 할 수 있는게 없다

hibernate로 계속 찍히고 있었으며 default로 타게 하고 싶었는데 그에 대한 방법은 찾지못했다 아시는 분은 댓글 남겨주시면 감사하겠습니다.

 

인터넷에 찾아보니 처음으로 발견한 방법은


public class CustomMySQL5InnoDBDialect extends MySQL5Dialect {
    public CustomMySQL5InnoDBDialect() {
        super();
        gisterFunction("GROUP_CONCAT", new StandardSQLFunction("GROUP_CONCAT", StandardBasicTypes.STRING));
    }
}

 

출처 https://github.com/querydsl/querydsl/issues/2377

 

GROUP_CONCAT does NOT work in QueryDSL · Issue #2377 · querydsl/querydsl

Hi there, I am struggling to figure out how to use 'GROUP_CONCAT' in QueryDSL. final QDataSourceSmallEliminate eliminate = QDataSourceSmallEliminate.dataSourceSmallEliminate; final QLattitu...

github.com

방식이였는데 된다고 하는데 어쨋든? 나의 코드에는 적용되지 않았다.

도저히 안되겠다 싶어 nartiva query로 작성하려던 찰나에 마음을 비우고 있던 상태에서 티몬 개발 블로그에서 해당 글을 보고 있었는데

https://tmondev.blog.me/220719885673?Redirect=Log&from=postView

 

MyBatis, 과연 최선일까? - ORM 프로그래밍 도전기 (2)

ORM 프로그래밍, 실전 쿼리에 적용해보다!앞서 MyBatis를 사용하여 CRUD 구현 시 불편한 점을 J...

blog.naver.com

위와 방식은 똑같지만 조금은? 다르게 사용하고 있는 방식을 찾게되었다

//  org.hibernate.dialect.MySQL5Dialect
public class CustomMysqlDialect extends MySQL5Dialect {
    public CustomMysqlDialect() {
        super();
        // register custom/inner function here
		registerFunction("GROUP_CONCAT", new StandardSQLFunction("group_concat", StandardBasicTypes.STRING));
    }
}

이렇게 작성후 application.yml에 dialect 경로를 커스텀 해준 부분으로 수정해야 함

 

pring:
  profiles: local
  mvc:
    throw-exception-if-no-handler-found: true
  jpa:
    database: MYSQL
    open-in-view: false
    properties:
      javax.persistence.query.timeout: 20000
      hibernate:
        # 이 부분을 해당 경로로 수정해야 함
        dialect: CustomMysqlDialect
        generate_statistics: true
        format_sql: true

적용후 사용하니 다행이 잘 되었다 그러나 문제가 하나 있었는데

mysql은 group_concat(컬럼명 SPERATOR ',')

이런식으로 사용되는데 SPERATOR를 사용할 수 없게 되어서

group_concat(컬럼명, ' ') 공백으로 사용할 경우

해당 이미지처럼 a뒤에 빈 문자열이 추가가 된다.

도저히 SPERATOR를 주고 사용할 방법은 찾지 못했다 혹시나 아시는분은 댓글 달아주시면 감사하겠습니다.

stringTemplate를 주어서 위처럼 사용하면 됨

 

querydsl 사용 법은 정말 멀고도 멀다

힘들다....ㅎㅎ

반응형