[자바 ORM 표준 JPA 프로그래밍 - 기본편] 10-9강


https://inf.run/2zDo 강의를 수강하고 작성하는 게시물입니다.


1. JPQL 기본 함수

아래는 JPQL 기본 함수이므로 DB에 상관없이 쓸 수 있다.

  • CONCAT : 문자 더하기
  • SUBSTRING : 문자 범위 지정하여 잘라내기
  • TRIM : 공백 제거
  • LOWER, UPPER : 대소문자 변경
  • LENGTH : 문자의 길이
  • LOCATE : 문자에서 부분위치 찾기
  • ABS, SQRT, MOD : 수학기능
  • SIZE, INDEX(JPA 용도)

1.1. CONCAT

select concat('a', 'b') From Member m

근데 Hibernate는 문자를 제공할 때 아래처럼도 쓸 수 있다.

select 'a' || 'b' From Member m

1.2. SUBSTRING

select substring(m.username, 2, 3) From Member m

1.3. TRIM

LTRIM RTRIM 다 쓸 수 있다.

1.4. LOCATE

select locate('de', 'abcdef') From Member m

위처럼 실행하면 4를 반환한다.

1.5. SIZE

select size(t.members) From Team t

컬렉션의 크기를 반환해준다.

1.6. INDEX

일반적으로 쓸 수 있는 것은 아니고 @OrderColumn을 사용할때 (사용하는것을 추천하지 않는다) List 타입의 컬렉션에서의 값타입일때 옵션을 줘서 쓸 수 있다.

(값타입에서 잠깐 언급했다…)

컬렉션의 위치값을 구할때 쓸 수 있다.

안쓰는 것이 좋다.. 데이터가 빠지면 null로 나오고 그러므로 안쓰는 것이 좋다.

2. 사용자 정의 함수

JPQL 기본함수로 할 수 없는경우 사용자 정의 함수를 호출하면 된다.

Application을 개발하다보면 DB의 함수를 불러와야할 때가 있다. 그 함수를 불러올때 사용하는 방법이다.

하이버네이트는 사용전 방언에 추가해야 한다.

사용하는 DB 방언을 상속받고, 사용자 정의 함수를 등록한 다.

방언을 추가하면 아래처럼 쓸 수 있다.

group_concat 이라는 함수를 등록했다고 치고 dilect를 만들어 등록해야한다.

public class MyH2Dialect extends H2Dialect {
  public MyH2Dialect() {
    registerFunction("group_concat", new StandardSQLFunction("group_concat", StandardBasicTypes.STRING));
  }
}

등록하는것을 외우는 것은 무리이고 실제 소스코드를 열어서 자세히 나와있는것을 참고하여 만들면된다.

그 후 설정(persistence.xml)에 방언 속성을 수정해준다.

<property name="hibernate.dialect" value="dialect.MyH2Dialect"/>
select function('group_concat', m.username) from Member m

group_concat은 H2가 갖고있는 것이긴 한데 출력된 결과를 한줄의 String으로 나타내주는 함수이다.

참고로 하이버네이트를 사용한다면 직관적으로 아래처럼도 쓸 수 있다.

select group_concat(m.username) from Member m

intelliJ에서는 오류가나올 수 있다.

3. 다행이도…?

Dialect에 보면 DB에 해당하는 대부분의 함수가 등록이 되어있다.

댓글 남기기