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를 받는 생성자가 필요한 것이다.