티스토리 뷰
업무를 진행하던 도중 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();
}
'Spring' 카테고리의 다른 글
[Security] hasIpAddress 사용하기 (0) | 2024.03.09 |
---|---|
데이터의 모든 변경이력 관리하기 with Hibernate (1) | 2023.12.23 |
트랜잭션의 전파속성 중 Nested 사용해보기 (0) | 2023.12.02 |
DispatcherServlet (1) | 2023.11.18 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크