JPQL 파라미터 바인딩, 프로젝션
2022. 3. 28. 18:15ㆍJPA 기초
JPQL은 파라미터 바인딩을 두가지 방법으로 할 수 있음
1) 이름 기준 -- 권장
2) 위치 기준 -- 권장X
이름 기준
SELECT m FROM Member m where m.username=:username
query.setParameter("username", usernameParam);
위치 기준
SELECT m FROM Member m where m.username=?1
query.setParameter(1, usernameParam)
위치 기준이 권장되지 않는 이유는, 카운팅 중간에 다른 쿼리가 들어와야 하는 경우,
그 숫자부터 줄줄이 밀려 전부 변경해야 한다. 가급적이면 이름 기준으로 파라미터를 바인딩 하자.
프로젝션 : SELECT 절에 조회할 대상을 지정하는 것
프로젝션 대상: 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자등 기본 데이터 타입) 등
• SELECT m FROM Member m -> 엔티티 프로젝션 (m은 Member의 별칭이다)
• SELECT m.team FROM Member m -> 엔티티 프로젝션 (Member와 연관된 Team 엔티티)
• SELECT m.address FROM Member m -> 임베디드 타입 프로젝션 (Member에 Address라는 Embedded 값 타입이 있다고 가정하자)
• SELECT m.username, m.age FROM Member m -> 스칼라 타입 프로젝션
• DISTINCT로 중복 제거 가능
참고로 Member의 Team을 조회할 때, Member와 Team을 join한 쿼리가 날라간다.
em.createQuery("select m.team from Member m", Team.class);
em.createQuery("select t from Member m join m.team t", Team.class);
두 코드를 통해 날리는 쿼리문은 동일하지만, 아래의 쿼리문처럼 구체적이고 명확하게 쿼리문을 작성해서 써주도록 하자(원인을 찾기 어려운 join 쿼리는 코드가 복잡해질수록 문제가 된다. join은 성능과 직결되기 때문이다!!)
'JPA 기초' 카테고리의 다른 글
JPA proxy - Lazy, Eager loading (0) | 2022.03.30 |
---|---|
JPQL 페이징 쿼리 & 서브쿼리, 조건식, 기본 함수 (0) | 2022.03.29 |
JPQL 기본 문법 (0) | 2022.03.28 |
JPA의 데이터 타입 - 값 타입, 엔티티 타입(4) (0) | 2022.03.26 |
JPA의 데이터 타입 - 값 타입, 엔티티 타입(3) (0) | 2022.03.26 |