[JPA 기본 - JQPL] 프로젝션 (SELECT)

강신현·2022년 7월 27일
0

프로젝션

SELECT 절에 조회할 대상을 지정하는 것

1. 엔티티 프로젝션

SELECT m FROM Member m
SELECT m.team FROM Member m

2. 임베디드 타입 프로젝션

SELECT m.address FROM Member m

3. 스칼라 타입 프로젝션

SELECT m.username, m.age FROM Member m
  • DISTINCT로 중복 제거

여러 값 조회

1. Query 타입으로 조회

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

em.flush();
em.clear();

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("result = " + result[0]);
System.out.println("result = " + result[1]);

2. Object[] 타입으로 조회

List<Object[]> resultList = em.createQuery("select 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]);

3. new 명령어로 조회

  • MemberDTO
    순서와 타입이 일치하는 생성자 필요
public class MemberDTO {

    private String username;
    private int age;
    
    public MemberDTO(String username, int age) {
        this.username = username;
        this.age = age;
    }

    public String getUsername() {
        return username;
    }

    public int getAge() {
        return age;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
  • Main
    패키지 명을 포함한 전체 클래스 명 입력
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());
profile
땅콩의 모험 (server)

0개의 댓글