JPA (13) JPQL 기본 함수, 사용자 정의 함수, 경로 표현식

김영한님의 자바 ORM 표준 JPA 프로그래밍 강의 정리

JPQL 기본 함수

  • JPQL이 제공하는 표준 함수로 DB 상관없이 사용 가능

  • CONCAT: 문자열 더하기
  • SUBSTRING: 문자열 자르기
  • TRIM: 공백 제거
  • LOWER, UPPER: 소문자, 대문자
  • LENGTH: 문자열 길이
  • LOCATE: 문자열이 시작하는 위치(1부터 시작)
  • ABS, SQRT, MOD
  • SIZE: 연관 관계의 콜렉션 크기를 알 수 있음
SELECT SIZE(t.members) FROM Team t
  • INDEX

사용자 정의 함수

  • Hibernate는 사용 전에 방언에 추가해야 함
  • 사용하는 DB 방언을 상속 받고 사용자 정의 함수 등록
public class CustomDialect extends H2Dialect {
  
  public CustomDialect() {
    // 사용자 정의 함수 등록
    registerFuntion("group_concat", new StandardSQLFunction("group_concat", StandardBasicTypes.STRING));
  }
}
SELECT FUNCTION("group_concat", i.name) FROM Item i

경로 표현식

  • .을 찍어 객체 그래프를 탐색하는 것
SELECT m.username	-- 상태 필드
FROM Member m
JOIN m.team t			-- 단일 값 연관 필드
JOIN m.orders o		-- 컬렉션 값 연관 필드
WHERE t.name = 'A'
  • 상태 필드

    • 단순히 값을 저장하기 위한 필드
    • 경로 탐색의 끝
    • 더이상 탐색하지 않음
  • 연관 필드

    • 연관 관계를 위한 필드

    • 단일 값 연관 필드

      • @ManyToOne, @OneToOne
      • 대상이 엔티티
      • 묵시적 내부 조인 발생
      • 계속 탐색 가능
      SELECT o.member.team FROM Orders o	-- 가능
      
    • 컬렉션 값 연관 필드

      • @OneToMany, @ManyToMany
      • 대상이 컬렉션
      • 묵시적 내부 조인이 발생하지만 탐색할 수 없음
      SELECT t.members.username FROM Team t -- 실패
      
      • FROM 절에서 명시적 조인을 통해 별칭을 얻으면 별칭을 통해 탐색 가능
      SELECT m.username FROM Team t JOIN t.members m -- 가능
      
  • 묵시적 조인보다 명시적 조인을 쓰는 것 권장

    • 쿼리 튜닝하기 더 편함
    • 묵시적 조인은 조인이 일어나는 상황을 한 눈에 파악하기 어려움
  • 경로 탐색은 주로 SELECT, WHERE 절에서 사용하지만 묵시적 조인으로 FROM (JOIN) 절에 영향을 줄 수 있음

명시적 join & 묵시적 join

  • 명시적

    • 직접 join 키워드 사용
    SELECT m FROM Member m JOIN m.team t
    
  • 묵시적

    • 경로 표현식에 의해 묵시적으로 SQL join 발생
    • 내부 join만 가능
    SELECT m.team FROM Member m