📌 프로젝션 (SELECT)
- SELECT 절에 조회할 대상을 지정하는 것
- 프로젝션 대상: 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자등 기본 데이터 타입) **관계형 DB는 스칼라 타입만 넣을 수 있음
- SELECT m FROM Member m ->엔티티 프로젝션
- SELECT m.team FROM Member m ->엔티티프로젝션(멤버에 연관된 팀)
- SELECT m.address FROM Member m -> 임베디드 타입 프로젝션
- 임베디드는 모두 어디 소속돼있기에 어디 소속인지를 명시해줘야함 (그냥 address만 적을 수 없다는 의미. m.address)
- SELECT m.username, m.age FROM Member m -> 스칼라 타입 프로젝션
- DISTINCT로 중복 제거
💡엔티티 프로젝션 ⇒ 영속성 컨텍스트에서 관리됨
프로젝션 - 여러 값 조회
타입이 다른 여러 필드는 어떻게 가져올까???
- SELECT m.username, m.age FROM Member m
1. Query 타입으로 조회
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]);
타입을 명시못하니까 내부적으로 object 배열이 들어감.
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]);
3. new 명령어로 조회 (제일 깔끔⭐)
- 단순 값을 DTO로 바로 조회
- SELECT new jpabook.jpql.UserDTO(m.username, m.age) FROM Member m
- 패키지 명을 포함한 전체 클래스 명 입력
- 순서와 타입이 일치하는 생성자 필요
- (아래 예시에서 username과 age 순서, 타입 일치해야한다는 의미)
package jpql;
public class MemberDTO {
private String username;
private int age;
//생성자, Getter, Setter...
}
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.username = " + memberDTO.getUsername());
System.out.println("memberDTO.age = " + memberDTO.getAge());
📌 페이징
- JPA는 페이징을 다음 두 API로 추상화
- setFirstResult(int startPosition) : 조회 시작 위치 (0부터 시작)
- setMaxResults(int maxResult) : 조회할 데이터 수
try {
for(int i = 0; i < 100; i++) {
Member member = new Member();
member.setUsername("member" + i);
member.setAge(i);
em.persist(member);
}
em.flush();
em.clear();
List<Member> result = em.createQuery("select m from Member m order by m.age desc", Member.class)
.setFirstResult(0)
.setMaxResults(10)
.getResultList();
System.out.println("result.size() = " + result.size());
for (Member member1 : result) {
System.out.println("member1 = " + member1);
}
나이 많은 순부터 desc
반응형