JPQL에서 사용하는 함수
함수는
JPQL표준함수
Concat : 두 문자를 더해준다. 이를 concat(‘A’, ‘B’) 로 써도 되지만, ‘A’ || ‘B’ 를 써도 된다.
Substring : 자바의 substring은 문자열의 일부를 떼어내는 방식이다.
Trim : 공백을 제거한다.
Lower, upper : 전부 소문자/ 대문자로 바꾸어준다.
Length : 길이를 반환해준다.
Locate : locate(찾아야 하는 부분, 찾는 대상)으로 넣어 해당 위치를 반환해준다.
Abs, sqrt, mod : 일반적인 수학의 방식으로, 순서대로 절대값/제곱근/제곱을 구해준다.
Size, index : 팀을 기준으로, 팀에 속한 멤버의 수를 세어줄 수 있다. Select size(t.members) from Team t; index는 @OrderIndex(값타입 컬렉션)에서 인덱스를 구할 때 쓰인다. (잘 쓰이지는 않는다)
사용자 정의 함수
사용하고자 하는 DB방언을 상속받고, 사용자 정의 함수를 등록하는 방식이다.
즉, 사용전에 방언을 추가해야한다.
근데, 새로 만드는것도 좋지만, ~~Dialect 클래스를 열어보면, 여러가지 함수들이 이미 내장되어있다. 이를 꺼내서 쓰는 것도 방법이다.
경로 표현식
Member가 있을 때,
Username, Team, List<Orders>를 가지고 있다.
쿼리문에서
m.username(상태 필드)
m.team(단일값 연관 필드)
m.orders(컬렉션 값 연관 필드)
에 대한 쿼리문이 모두 다르게 나간다.
이에 대한 구분을 해야한다.
상태 : 단순 값 저장
연관 : 연관관계를 위한 필드
@~ToOne : 단일값 연관 필드
@~ToMany : 컬렉션값 연관 필드
로 구분된다.
상태 필드 : 경로탐색의 끝, 탐색이 더 깊이 존재하지 않는다.
단일 값 연관 필드 : 묵시적 내부 조인이 발생하며, 추가적인 탐색이 가능하다(즉, 멤버에서 팀을 가져왔을 때, 팀 내부를 또 탐색할 수 있다) m.team.name으로 한번 더 들어갈 수 있다.
컬렉션 값 연관 필드 : 묵시적 내부 조인이 발생하며, 탐색할 수 없다(컬렉션이 여러개 오는데 이중에서 어떤 것의 내부를 탐색할지 모르기 때문에 JPA 내부적으로 이를 막아두었다.)
하지만! 컬렉션에서 명시적 내부 조인을 실행했을 때, (select m from Team t join t.member m;) 별칭인 m을 이용해 내부 탐색을 할 수 있다.
묵시적인 내부조인은 우리가 모르는 쿼리가 더 들어간다.
이로인해 추가적인 쿼리문 조작이 힘들어진다.
운영적 측면에서 더 가시적으로 쿼리가 어떻게 되었을지를 생각하며 생각하는 그대로 표현해야한다(묵시적보단 가시적!)
'스프링 공부 > JPA' 카테고리의 다른 글
[JPA] 28. Re.Zero : JPQL : 뻘크업(연)산 (0) | 2023.01.19 |
---|---|
[JPA] 27. Re.Zero : JPQL 그냥 다 끍어오기.(fetch join) (0) | 2023.01.19 |
[JPA] 26. Re.Zero : JPQL 의 타입표현 (0) | 2023.01.19 |
[JPA] 25. Re.Zero : JPQL : 서브쿼리 (0) | 2023.01.19 |
[JPA] 24. Re.Zero : JPQL : join하실래요? 합석? (0) | 2023.01.19 |