JPA는 Dialect에 등록된 내용만 호출할 수 있다.

querydsl에서도 호출 가능하다.

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);
	}
}

사용하는 DB Dialect에 해당 함수가 존재해야 한다. 만약 DB에서 임의의 function을 만든다면 Dialect를 상속 받은 별도의 Dialect를 만들어 넣어 사용해야 한다.

toLowercase

@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);
	}
}