BackEnd/ORM(JPA)

프로젝션(SELECT)

프로젝션이란?


  • 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로 중복 제거

엔티티 프로젝션으로 가져온 엔티티들은 영속성 컨텍스트에 관리되어 entity변경이 반영됨

...
Member member = new Member();
member.setUsername("member1");
member.setAge(10);
em.persist(member);

List<Member> result = em.createQuery("select m from Member m", Member.class).getResultList();

Member findMember = result.get(0);
findMember.setAge(20);

tx.commit();
...

 

List<Team> result = em.createQuery("select m.Team from Member m",Team.class)
.getResultList();	// 묵시적 join
=> join query가 발생함 (inner Join) -> Join이 연관되면 성능적으로 민감하기때문에
=> sql과 유사하게 쿼리를 작성해야 한다.
List<Team> result = em.createQuery("select t from Member m join m.team t",Team.class)
.getResultList();	// 명시적 join

임베디드 타입 프로젝션

List<Team> result = em.createQuery("select o.address from Order o", Order.class)
.getResultList();

스칼라 타입 프로젝션

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

프로젝션 - 여러 값 조회


  • SELECT m.username, m.age FROM Member m
  • 1. Query 타입으로 조회
  • 2. Object[] 타입으로 조회
  • 3. new 명령어로 조회
    • 단순 값을 DTO로 바로 조회
    • SELECT new jpabook.jpql.UserDTO(m.username, m.age) FROM Member m
    • 패키지 명을 포함한 전체 클래스 명 입력
    • 순서와 타입이 일치하는 생성자 필요

Query 타입 조회

List resultList = em.createQuery("select m.username, m.age from Member m",
Member.class).getResultList();

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

or

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

new 명령어 조회

List<MemberDTO> resultList = 
em.createQuery("SELECT new jpabook.jpql.UserDTO(m.username, m.age) FROM Member m",
MemberDTO.class).getResultList();

 

'BackEnd > ORM(JPA)' 카테고리의 다른 글

조인  (0) 2023.02.18
페이징 API  (0) 2023.02.15
JPQL(Java Persistence Query Language)  (0) 2023.01.18
객체지향 쿼리 언어(JPQL)  (0) 2023.01.09
값 타입  (0) 2023.01.09