인프런 커뮤니티 질문&답변

zbqmgldjfh님의 프로필 이미지
zbqmgldjfh

작성한 질문수

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

경로 표현식

컬렉션 값 묵시적 조인에 대한 질문

작성

·

314

1

[질문 템플릿]

1. 강의 내용과 관련된 질문인가요? 예

2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예

3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

 

[질문 내용]

https://www.inflearn.com/questions/379070 이전 질문을 통해  t.member as m 임을 이해하였습니다. 

하지만 아직 1가지 의문이 듭니다.

 

질문 1)

String query = "select t.members from Team t";

위 코드는 묵시적 조인이 발생하고, 따라서 t.members.username 과 같은 호출은 불가능하게 됩니다. 

왜냐하면 members는 collection이기 때문에 size와 같은 collection에 대한 정보는 얻어올수 있어도, collection 안에 있는 원소에 대한 정보를 얻어올수는 없기 때문이죠.

 

따라서 강의에서는 다음과 같이 명시적 조인으로 바꾸면

select m.username from Team t join t.members m

과 같이 m.username 와 같은 사용이 가능하다고 하셨습니다.

 

하지만 두 코드 모두 

1. select t.members from Team t

2. select m from Team t join t.members m (member를 가져오기 위해 select m으로 변경)

동일한 SQL 생성됨을 알수있었습니다.

1. select t.members from Team t

2. select m from Team t join t.members m

두 코드 모두 같은 SQL문을 보여주더군요!

 

여기서 질문!!

둘다 같은 SQL을 생성하는데 SELECT 절에서 왜 묵시적 조인 쪽은 username에 접근이 안되고,

명시적 조인은 username에 접근이 가능한가요?

 

select t.members from Team t 에 의해서 생성되는 SQL 문을 A

select m from Team t join t.members m 에 의해서 생성되는 SQL 문을 B 라고 한다면

AB랑 같은 SQL문을 보여주는데,  B에서 username을 얻어올 수 있듯,

A에서 username을 얻어올수 있지 않을까? 생각해서 질문 남겨봅니다.

 

(참고로 t.members는 collection자체이기 때문에 원소 자체의 필드인 username에 접근 불가능하며

m은 Member 엔티티니까 m.username, m.age와 같이 접근 가능한것은 알겠는데, 

이는 JPQL상의 코드에서 나타나는 차이지 SQL상에서는 동일하게 SELECT 쿼리를 보내는것 같아서요.)

 

저의 질문 의도가 좀 명확하지 않다면 죄송합니다 ㅠ.ㅠ

답변 1

3

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. zbqmgldjfh님

JPQL을 객체를 대상으로 하는 쿼리라고 생각해보시면 이해가 되실꺼에요.

컬렉션에 접근하는 경우 해당 컬렉션은 username 필드를 가지고 있지 않습니다.

t.members는 Member 자체에 접근하는 것이 아니라 Member를 담고 있는 컬렉션에 접근하는 것이지요.

명시적 조인은 Member에 접근하는 참조를 얻은 것이라 생각하면 됩니다.

감사합니다.

zbqmgldjfh님의 프로필 이미지
zbqmgldjfh
질문자

앗!! "JPQL을 객체를 대상으로 하는 쿼리" 라고 생각하니 이해가 되는것 같습니다!!

당연히 객체를 대상으로 생각해야하는데... 어느순간 부터 SQL문을 보고있다보니 RDB상에서 생각하고 있었네요 ㅠ.ㅠ

답변 감사합니다!!

zbqmgldjfh님의 프로필 이미지
zbqmgldjfh

작성한 질문수

질문하기