반응형
해당 글은 김영한 님의 querydsl을 수강하며 정리하려고 적는 포스팅입니다.
SQL function
- SQL function은 JPA와 같이 Dialect에 등록된 내용만 호출할 수 있다.
member - M으로 변경하는 replace 함수 사용
@Test
public void sqlFunction() {
List<String> result = queryFactory
.select(Expressions.stringTemplate("function('replace', {0}, {1}, {2})",
member.username, "member", "M"))
.from(member)
.fetch();
for (String s : result) {
System.out.println("s = " + s);
}
}
------------------------------------------------------------------------------------
2023-01-16T10:13:26.947+09:00 DEBUG 18232 --- [ main] org.hibernate.SQL :
/* select
function('replace', member1.username, ?1, ?2)
from
Member member1 */ select
replace(m1_0.username,?,?)
from
member m1_0
s = M1
s = M2
s = M3
s = M4
소문자로 변경해서 비교
@Test
public void sqlFunction2() {
List<String> result = queryFactory
.select(member.username)
.from(member)
.where(member.username.eq(
Expressions.stringTemplate("function('lower', {0})", member.username)))
.fetch();
for (String s : result) {
System.out.println("s = " + s);
}
}
----------------------------------------------------------------------------------------------
2023-01-16T10:14:13.500+09:00 DEBUG 17236 --- [ main] org.hibernate.SQL :
/* select
member1.username
from
Member member1
where
member1.username = function('lower', member1.username) */ select
m1_0.username
from
member m1_0
where
m1_0.username=lower(m1_0.username)
s = member1
s = member2
s = member3
s = member4
직접 만든 SQL Function을 사용하고 싶다면, H2Dialect 상속을 받아서 만들고 등록을해서 사용해야한다.
간단한 일반화된 Function은 QueryDsl에 내장되어 있다.
lower 같은 ansi 표준 함수들은 querydsl이 상당부분 내장하고 있어서 아래와 같이 처리해도 결과는 같아진다.
.where(member.username.eq(member.username.lower()))
참고 : Custom Dialect
인텔리제이에서 [shift + shift] 를 눌러 전체 검색에 H2Dialect를 검색해보면 된다.
그러면 아래에 수많은 functiond들을 기본으로 사용자가 쉽게 사용 할 수 있도록 미리 구현 시켜 두었다.
dialect를 상속하여 사용자 function 만들기
참고
반응형
'Java' 카테고리의 다른 글
[Querydsl] 동적 쿼리 성능 최적화 조회 - DTO, Builder 사용 (0) | 2023.01.16 |
---|---|
[JPA] 순수 JPA 리포지토리와 Querydsl (0) | 2023.01.16 |
[JPA] Querydsl 수정, 삭제 벌크 연산 (0) | 2023.01.15 |
[JPA] 동적 쿼리 - BooleanBuilder 사용 (0) | 2023.01.14 |
[JPA] 프로젝션과 결과 반환 - @QueryProjection (0) | 2023.01.13 |