JPQL 파라미터 바인딩, 프로젝션

2022. 3. 28. 18:15JPA 기초

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은 성능과 직결되기 때문이다!!)