임시저장 - 기능 확인 중

BOKS·2023년 5월 19일
0

Mariadb 10 버전을 사용하고 있습니다. JPA ORM을 사용했을때 JPA에서 지원하지 않는 함수를 사용한 방법을 공유해드리고자 작성했습니다. 부족한 점이 있을 수 있어 참고만 하시면 좋을 것 같습니다.

먼저 Hibernate (JPA)에서 group_concat을 지원하지 않기 때문에 예시에서 사용할 함수는 group_concat 함수입니다.

group_concat을 사용할 수 있도록 설정을 해야합니다. 아래는 제가 직접 설정에 사용한 클래스파일입니다.

1. 커스텀 Dialect 클래스 추가

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를 상속받으시면 될 것 같습니다.

2. application.properties(.yaml)

설정파일을 생성 후 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

3. 함수 사용 방법

그리고 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를 새로 조회하기 때문에 조건을 다 추가해야합니다.

profile
Kotlin, Springboot 2 백엔드 개발자

0개의 댓글