스프링 공부/JPA

[JPA] 26. Re.Zero : JPQL 함수/경로 표현

장아장 2023. 1. 19. 19:37

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을 이용해 내부 탐색을 할 수 있다. 

 

묵시적인 내부조인은 우리가 모르는 쿼리가 더 들어간다. 

이로인해 추가적인 쿼리문 조작이 힘들어진다. 

운영적 측면에서 더 가시적으로 쿼리가 어떻게 되었을지를 생각하며 생각하는 그대로 표현해야한다(묵시적보단 가시적!)