Mariadb 10 버전을 사용하고 있습니다. JPA ORM을 사용했을때 JPA에서 지원하지 않는 함수를 사용한 방법을 공유해드리고자 작성했습니다. 부족한 점이 있을 수 있어 참고만 하시면 좋을 것 같습니다.
group_concat을 사용할 수 있도록 설정을 해야합니다. 아래는 제가 직접 설정에 사용한 클래스파일입니다.
import org.hibernate.dialect.MariaDB106Dialect
import org.hibernate.dialect.function.SQLFunctionTemplate
import org.hibernate.dialect.function.StandardSQLFunction
import org.hibernate.type.StandardBasicTypes
class MariaDBFunctionsDialect : MariaDB106Dialect() {
init {
// native function 추가 - hibernate 버그인지 등록을 안 해주면 실행을 못 함
/**
* Function to evaluate regexp in MySQL
* 참조 : https://stackoverflow.com/questions/17702544/hibernate-regexp-mysql/17702545#17702545
*/
registerFunction(
"REGEXP",
SQLFunctionTemplate(
StandardBasicTypes.BOOLEAN, "?1 REGEXP ?2"
)
)
registerFunction(
"GROUP_CONCAT",
StandardSQLFunction("group_concat", StandardBasicTypes.STRING)
)
}
}
MariaDB106Dialect (mariadb 10.6 버전)을 상속받았으므로 맞는 버전의 Dialect를 상속받으시면 될 것 같습니다.
설정파일을 생성 후 spring에서 해당 dialect를 사용하도록 설정을 해줘야 합니다.
# to use custom dialect
spring.jpa.properties.hibernate.dialect=package.MariaDBFun
ctionsDialect
spring:
jpa:
properties:
hibernate:
# to use custom dialect
dialect: package.MariaDBFunctionsDialect
그리고 select group_concat(distinct a.id) from a; 를 작성한다고 했을 때 예시입니다.
queryFactory.select(
JPAExpressions.selectDistinct(Expressions.stringTemplate("group_concat({0})", a.id)).from(QA.a)
)
.from(QTemp.temp)
.fetchOne()
처음에는 group_concat만 사용했다가 distinct도 같이 사용할 수 있는 방법이 없을까? 하다가 이 글을 보게되었고 해결하게 되면서 도움이 될 수 있으면 좋겠어서 공유드립니다.
JPAExpressions.selectDistinct(Expressions.stringTemplate("group_concat({0})", a.id)).from(QA.a) 의 문제점으론 a를 새로 조회하기 때문에 조건을 다 추가해야합니다.