QueryDsl QuerydslRepositorySupport에서 group_concat사용하기!
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 사용 법은 정말 멀고도 멀다
힘들다....ㅎㅎ