JPA는 Dialect에 등록된 내용만 호출할 수 있다.
querydsl에서도 호출 가능하다.
@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);
}
}
사용하는 DB Dialect에 해당 함수가 존재해야 한다. 만약 DB에서 임의의 function을 만든다면 Dialect를 상속 받은 별도의 Dialect를 만들어 넣어 사용해야 한다.
@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);
}
}
이러한 간단한 함수들은 ANSI 표준에 다 등록되어 있는 것들이다. 왠만한 DB에 전부 구현되어 있다. 그래서 다음과 같이 바꿀 수 있다.
@Test
public void sqlFunction2() {
List<String> result = queryFactory
.select(member.username)
.from(member)
.where(member.username.eq(member.username.lower()))
.fetch();
for (String s : result) {
System.out.println(s);
}
}