프로젝션
Select절에서 조회 대상을 지정하는 것.
엔티티, 임베디드타입, 스칼라 타입(숫자, 문자, 기본 데이터 타입)
Select m from Member as m ~~; (엔티티)
Select m.username, m.age from Member as m~~; (엔티티의 스칼라 타입)
Select m.team from Member as m ~~; (연관관계의 엔티티)
Select m.address from Member asm m ~~;(임베디드 타입)
전부다 조회 가능하며, select 뒤에 distinct를 넣어 중복을 제거할 수 있다.
조회를 해서 엔티티를 불러오는 방법은 알겠는데,
우리가 조회한 엔티티의 인스턴스를 수정하면 어떻게 될까?
이러한 코드를 실행했을 때,
Select, update 쿼리가 나가는 것을 볼 수 있었다.
즉, select에서 조회된 엔티티들은 영속성 컨텍스트의 관리를 받는 것을 알 수 있다.
엔티티에서 연관관계에 있는 엔티티들을 조회할 때, 이런 식으로 처리할 수 있다.
근데 쿼리문은 이렇게 나간다.
이게 문제가, 예측이 안되는 것이라고 한다.
즉, 우리가 만들 때 어떤 기능을 예상하고 만드는데, 이를 벗어나는 상황이 나올 수 있다는 문제가 있다.
그래서,
이렇게 어떤 쿼리가 나갈지 생각해서, 명시적으로 써주는게 좋다.
이를 명시적 조인, 앞에 썼던 것을 묵시적 조인이라고 한다.
(사실 말 들으니 그렇겠거니 싶다. 명시적으로 join이 존재하거나, 없지만 우리가 암묵적으로 join이 있을 것이라고 생각하는 것이니까…)
여기에서 특이한 점은, embedded로 이루어진 address의 경우이다.
이 때는 join 쿼리가 아닌, 해당 인스턴스만을 조회해온다.
이유는, 임베디드 값타입이지, 엔티티가 아니기 때문이다.
'스프링 공부 > JPA' 카테고리의 다른 글
[JPA] 25. Re.Zero : JPQL : 서브쿼리 (0) | 2023.01.19 |
---|---|
[JPA] 24. Re.Zero : JPQL : join하실래요? 합석? (0) | 2023.01.19 |
[JPA] 22. Re.Zero : JPQL : 언제까지 리스트에서 잘라서 반환하게 할꺼야? 페이징 (0) | 2023.01.19 |
[JPA] 21. Re.Zero : JPQL로 다시 시작하는 프로젝트! (0) | 2023.01.19 |
[JPA] 20. JPA에서 쿼리를 쓰는 방법 (2) | 2023.01.17 |