hoondev

[Spring JPA] JPQL 프로젝션 본문

Spring JPA

[Spring JPA] JPQL 프로젝션

hoondev3 2023. 2. 14. 16:58

프로젝션

SELECT 절에 조회할 대상을 지정하는 것이 프로젝션이다.

프로젝션 대상은 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자 등 기본 데이터 타입)이 있다.

 

엔티티 프로젝션

SELECT m FROM Member m

SELECT m.team FROM Member m

 

임베디드 타입 프로젝션 

SELECT m.address FROM Member m

 

스칼라 타입 프로젝션

SELECT m.username, m.age FROM Member m

 

DISTINCT로 중복제거

 

여러 값 조회

Query 타입으로 조회

List resultList = em.createQuery("select distinct m.username, m.age from Member m")
        .getResultList();
        
Object o = resultList.get(0);
Object[] result = (Object[]) o;

System.out.println("result = " + result[0]);
System.out.println("result = " + result[1]);

이렇게 Object[]로 형변환을 해줘야 한다.

 

Object [] 타입으로 조회

List<Object[]> resultList = em.createQuery("select distinct m.username, m.age from Member m")
        .getResultList();

Object[] result = resultList.get(0);

System.out.println("result = " + result[0]);
System.out.println("result = " + result[1]);

이렇게 하면 형변환 작업을 건너뛸 수 있다.

 

new 명령어로 조회

List<MemberDTO> result = em.createQuery("select new jpql.MemberDTO(m.username, m.age) from Member m", MemberDTO.class)
        .getResultList();

MemberDTO memberDTO = result.get(0);

System.out.println("memberDTO = " + memberDTO.getUsername());
System.out.println("memberDTO = " + memberDTO.getAge());

new 명령어로 조회할 수 있다. 하지만 패키지 명을 포함한 전체 클래스 명을 입력해야 하기 때문에 불편하다.

순서와 타입이 일치하는 생성자도 필요하다.  select new jpql.MemberDTO(m.username, m.age)에서 MemberDto에 username과 age를 받는 생성자가 필요한 것이다.

 

Reference

https://www.inflearn.com/course/ORM-JPA-Basic

'Spring JPA' 카테고리의 다른 글

[Spring JPA] JPQL 페이징  (0) 2023.02.16
[Spring JPA] 기본 문법과 쿼리 API  (0) 2023.02.13
[Spring JPA] 객체지향 쿼리 언어  (0) 2023.02.10
[Spring JPA] 값 타입 컬렉션  (0) 2023.02.09
[Spring JPA] 값 타입의 비교  (0) 2023.02.08
Comments