객체지향 쿼리 언어 - JPQL 함수

도윤·2024년 3월 22일
post-thumbnail

JPQL 함수

JPQL 기본 함수

  • JPQL 이 제공하는 표준 함수이다. DB 와 상관없이 그냥 사용하면 된다.
  • CONCAT : 문자열을 이어주는(더하는) 함수

concat 같은 경우는 하이버네이트에서 || 으로도 지원한다.

String query = "select 'a' || 'b' from Member m";
  • SUBSTRING : 문자열을 잘라내는 함수
String query = "select substring(m.username,2,3) from Member m";
// 2번째 문자부터 3개선택 -> dmi

substring 의 인자로는 대상, startIndex, length 로 구성된다. startIndex 부터 length 의 길이만큼 문자열을 잘라 반환한다. 현재 member 에 셋팅되어 있는 username 은 Admin 이므로 다음과 같이 출력된다.

만약 매개변수로 대상과 startIndex만 있을 시 startInex 에서부터 문자의 마지막까지 잘라 반환해준다.

String query = "select substring(m.username,2) from Member m";

//출력
s = dmin
  • TRIM : 문자열의 양 끝 공백을 제거해주는 함수로 LTRIN(왼쪽 공백만 제거), RTRIM(오른쪽 공백만 제거) 모두 사용가능하다.
member.setUsername("   Ad mi n    ");

username 이 위와 같은 값을 가졌을때 trim 을 사용하면 다음과 같이 출력된다.

  • LOWER, UPPER : LOWER 의 경우 모든 문자를 소문자로 변환, UPPER 의 경우 모든 문자를 대문자로 변환해주는 함수이다.

  • LENGTH : 문자의 길이를 반환한다.
  • LOCATE : 원하는 문자의 시작 INDEX 를 알려주는 함수이다.
  • ABS(절댓값 반환), SQRT(제곱근 반환) , MOD(나눗셈 나머지 반환)
  • SIZE(컬렉션의 크기 반환), INDEX(JPA 용도)

    index 의 경우에는 일반적으로 사용할 수는 없고 값 타입 컬렉션에서 @OrderColumn 를 사용했을 때 사용할 수 있는 함수이다. 근데 값 타입 컬렉션의 위치값을 구할 때 사용할 수 있는데 그냥 안쓰는게 좋다.

사용자 정의 함수 호출

  • JPQL 에서 제공하는 표준 함수 외 DB 에서 제공하는 함수를 불러서 사용하는 방법이다.
  • 하이버네이트는 사용 전 방언에 추가해야 한다.
    • 사용하는 DB 방언을 상속받고, 사용자 정의 함수를 등록한다.
  • 하이버네이트에 대부분의 DB 에서 사용하는 함수들이 다 선언되어 있기 때문에 그냥 호출해서 사용하면 된다.

    예시를 위해 'group_concat' 이라는 사용자 정의 함수가 있다고 치자(원래 구현되어 있는 함수임). 이 사용자 정의 함수를 등록하려면 먼저 새로운 패키지와 클래스를 만들어줘야 한다.
    패키지는 dialect, 클래스 명은 MyH2Dialect 로 생성해준다.
public class MYH2Dialecdt extends H2Dialect {

public MyH2Dialecdt() {
registerFunction("group_concat", new StandardSQLFuncdtion("group_concat", StandardBasicTypes.STRING)
}
}

persistence.xml

<property name = "hibernate.dialect" value="dialect.MYH2dialect"/>

그리고 실행 클래스에서 아래와 같이 사용하면 된다.

출처 : 자바 ORM 표준 JPA 프로그래밍 - 기본편

profile
기록은 기억을 이긴다⭐

0개의 댓글