-
QueryDsl QuerydslRepositorySupport에서 group_concat사용하기!JPA 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
방식이였는데 된다고 하는데 어쨋든? 나의 코드에는 적용되지 않았다.
도저히 안되겠다 싶어 nartiva query로 작성하려던 찰나에 마음을 비우고 있던 상태에서 티몬 개발 블로그에서 해당 글을 보고 있었는데
https://tmondev.blog.me/220719885673?Redirect=Log&from=postView
위와 방식은 똑같지만 조금은? 다르게 사용하고 있는 방식을 찾게되었다
// 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 사용 법은 정말 멀고도 멀다
힘들다....ㅎㅎ
반응형'JPA' 카테고리의 다른 글
spring batch에서 JPASQLQuery를 사용한 이유 (0) 2021.04.05 Spring Batch with QuerydslItemReader (0) 2020.05.02 QueryDsl - char(1)보다는 varchar(1)을 사용하자 (0) 2019.10.21 QueryDsl from subquery와 join을 해보자! (10) 2019.09.03 QueryDsl - Date 작성시 Expressions.dateTemplate를 사용하자! (2) 2019.09.03