JPA (13) JPQL 기본 함수, 사용자 정의 함수, 경로 표현식
03 Apr 2022김영한님의 자바 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