[자바 ORM 표준 JPA 프로그래밍 - 기본편] 10-3강
https://inf.run/2zDo 강의를 수강하고 작성하는 게시물입니다.
1. 프로젝션
- 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로 중복 제거
1.1. 엔티티 프로젝션 1
Member member = new Member();
member.setUsername("member1");
member.setAge(10);
em.persist(member);
em.flush();
em.clear();
List<Member> result = em.createQuery("select m from Member m", Member.class).getResultList();
Member findMember = result.get(0);
findMember.setAge(20);
tx.commit();
위를 실행했을때 update쿼리문이 나간다. getResultList를 사용하면 영속성 컨텍스트에 업데이트 된다는 소리이다.
1.2. 엔티티 프로젝션 2
SELECT m.team FROM Member m
위처럼 쿼리문을 할경우 join문이 발생한다.
위 쿼리문은 안쓰는 것이 좋고 이왕이면 명시적으로 하는것이 좋다.(위같은 쿼리를 묵시적 쿼리라고 한다.)
1.3. 임베디드 타입 프로젝션
SELECT m.address FROM Member m
임베디드타입으로 객체에서는 분리했지만 db에서는 합쳐져 있기 때문에 아무 상관없이 select 되어진다.
1.4. 스칼라 타입 프로젝션
SELECT m.username, m.age FROM Member m
SELECT DISTINCT m.username, m.age FROM Member m
위처럼 막 가져오는 것을 스칼라 타입 프로젝션이라고 한다.
1.5. 프로젝션 여러 값 조회
스칼라 타입의 예제처럼 여러개의 값을 가져올때는 3가지의 방법으로 가져올 수 있다.
1.5.1. Query 타입으로 조회
이전 강의에서 배웠던 Query 타입으로 조회를 한다.
예를 들어보면 아래와 같은데 내부는 Object타입으로 들어있다.
Query query =
em.createQuery("SELECT m.username, m.age from Member m");
List resultList =
em.createQuery("SELECT m.username, m.age from Member m")
.getResultList();
Object o = resultList.get(0);
Object[] result = (Object[]) o;
System.out.println("username = "+ result[0]);
System.out.println("age = "+ result[1]);
1.5.2. Object[] 타입으로 조회
List<Object[]> resultList =
em.createQuery("SELECT m.username, m.age from Member m")
.getResultList();
Object[] result = resultList.get(0);
System.out.println("username = "+ result[0]);
System.out.println("age = "+ result[1]);
1.5.3. new 명령어 사용
제일 깔끔한 방법
- 단순 값을 DTO로 바로 조회 SELECT new jpabook.jpql.UserDTO(m.username, m.age) FROM Member m
- 패키지명을 포함한 전체 클래스명 입력
- 순서와 타입이 일치하는 생성자 필요
SELECT new jpabook.jpql.UserDTO(m.username, m.age) FROM Member m
댓글 남기기