티스토리 뷰

Spring

윈도우 함수 사용하기 - (1/3)

개발하고싶은개발자 2023. 12. 22. 18:02

업무를 진행하던 도중 QueryDsl에서 윈도우 함수(row_number)를 사용하려고 했다.

 

테이블의 정보는 아래와 같다

create table member
(
    id         serial primary key,
    name       varchar,
    team_id    integer references team,
    created_at timestamp default now(),
    deleted_at timestamp
);

create table team
(
    id   serial primary key,
    name varchar
);

 

이때 QueryDsl에서 아래와 같은 코드를 실행하면 에러가 발생한다

public List<Long> getTeamMemberRows() {

	SimpleExpression<Long> rowNumber = SQLExpressions.rowNumber()
		.over()
		.partitionBy(member.team)
		.as("rowNumber");

	return select(rowNumber).from(member).fetch();
}

에러 로그

 

 

 

 

이 중 첫 번째 방법인 custom fuction을 등록해서 사용하는 방법을 소개해보려고 한다.

 

1. 일단 사용하려고 하는 함수인 row_number를 등록한다.

등록하는 방법은 MetadataBuilderContributor 인터페이스를 구현하며 contribute 메소드에 등록해 주면 된다

package com.org.common.db.diarect;

import org.hibernate.boot.MetadataBuilder;
import org.hibernate.boot.spi.MetadataBuilderContributor;
import org.hibernate.dialect.function.SQLFunctionTemplate;
import org.hibernate.type.IntegerType;

public class CustomDialect implements MetadataBuilderContributor {
	@Override
	public void contribute(MetadataBuilder metadataBuilder) {
		metadataBuilder
			.applySqlFunction("ROW_NUMBER",new SQLFunctionTemplate(IntegerType.INSTANCE, "ROW_NUMBER() OVER (PARTITION BY ?1)"));
	}
}

 

 

2. 위의 클래스를 hibernate에 등록해준다

spring.jpa.properties.hibernate.metadata_builder_contributor=com.org.common.db.diarect.CustomDialect

 

 

3. 이제 JPQL에서 정상적으로 사용할 수 있다

public List<Long> getTeamMemberRows() {
	return select(Expressions.numberTemplate(Long.class,"function('ROW_NUMBER', {0})",member.team))
		.from(member)
		.fetch();
}

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30