강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

uncia님의 프로필 이미지
uncia

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

JPQL 함수

group_concat 사용자 정의 함수 등록하는 방법

작성

·

92

1

섹션 11-9 JPQL 함수에서, 사용자 정의 함수(group_concat) 구현 시 Hibernate(6.4.2.Final)버전을 사용할 때 가능한 방법 공유드립니다.

 

  1. 강의에서 MyH2Dialect 클래스 구현하는 대신, FunctionContributor를 구현

public class MyH2FunctionContributor implements FunctionContributor {

    @Override
    public void contributeFunctions(FunctionContributions fc) {
        TypeConfiguration typeConfig = fc.getTypeConfiguration();
        SqmFunctionRegistry registry = fc.getFunctionRegistry();

        // ✅ 문자열 반환 타입을 직접 조회
        BasicType<?> stringType = typeConfig.getBasicTypeRegistry().getRegisteredType("string");

        // ✅ 사용자 정의 함수 등록
        registry.registerPattern(
                "group_concat",
                "group_concat(?1)",
                stringType
        );
    }
}

 

  1. 서비스 등록 (META-INF/services/org.hibernate.boot.model.FunctionContributor)

jpql.MyH2FunctionContributor

 

  1. 예시 쿼리

Team team = new Team();
team.setName("teamA");
em.persist(team);

Member member = new Member();
member.setUsername("관리자");
member.setAge(10);
member.setType(MemberType.ADMIN);

Member member2 = new Member();
member2.setUsername("사용자2");
member2.setAge(10);
member2.setType(MemberType.USER);


member.changeTeam(team);
em.persist(member);
em.persist(member2);

em.flush();
em.clear();

String query = "select group_concat(m.username) from Member m";
List<String> result = em.createQuery(query, String.class).getResultList();
for (String s : result) {
    System.out.println("s = " + s);
}
  1. 결과 쿼리

Hibernate:

/* select

group_concat(m.username)

from

Member m */ select

group_concat(m1_0.username)

from

Member m1_0

s = 관리자,사용자2

 

 

 

 

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. uncia님.

Hibernate 6 버전 이상에서 사용자 정의 함수를 등록하는 과정은 이전 버전과 약간 다를 수 있습니다. FunctionContributor 인터페이스를 구현하여 사용자 정의 함수를 등록할 수 있는데, 이는 이전의 Dialect 클래스에서 함수 정의를 관리하던 방식과 차이가 있습니다.

사용자 정의 함수 등록 방법

  1. FunctionContributor 구현

    • 사용자 정의 함수를 통해 직접 SQL 패턴을 등록합니다.
    • 문자열 반환 타입을 TypeConfiguration에서 getBasicTypeRegistry로 직접 조회하고, 이를 바탕으로 함수를 등록합니다.
  2. 서비스 파일 등록

    • META-INF/services/org.hibernate.boot.model.FunctionContributor 파일에 MyH2FunctionContributor 클래스를 등록하여 Hibernate가 자동으로 탐지하도록 합니다.
  3. JPQL 쿼리 사용

    • createQuery 메소드를 통해 JPQL의 사용자 정의 함수를 호출할 수 있습니다.

질문자님께서 제공해주신 코드를 통해 group_concat 함수의 등록과 사용 방법을 잘 설명해 주셨습니다. 추가로, 기존의 강의 내용에서도 사용자 정의 함수에 대한 예시를 확인하실 수 있습니다.

추가적으로 참고할 수 있는 관련 질문 URL은 다음과 같습니다:
- “사용자 등록함”

이 질문에서도 개인 및 커뮤니티에서 제공한 여러 가지 사용자 정의 함수 구현 전략에 대해 설명하고 있으니 참조하시면 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

uncia님의 프로필 이미지
uncia

작성한 질문수

질문하기