JPA

프로젝션 NEW 명령어

쿠카이든 2022. 6. 14. 18:03
728x90
  • 바로 밑의 예제는 username, age 두 필드를 프로젝션해서 타입을 지정할 수 없으므로 TypeQuery를 사용할 수 없다. 따라서 Object[]를 반환받았다.
List<Object[]> resultList = 
    em.createQuery("SELECT m.username, m.age FROM Member m")
    .getResultList();
    
//객체 변환 작업
List<UserDTO> userDTOs = new ArrayList<UserDTO>();
for (Object[] row : resultList) {
    UserDTO userDTO = new UserDTO((String)row[0], (Integer)row[1]);
    userDTOs.add(userDTO);
}
return userDTOs;
public class UserDTO {

    private String username;
    private int age;
    
    public UserDTO(String username, int age) {
        this.username = username;
        this.age = age;
    }
    //...
}
  • 이런 객체 변환 작업은 지루하다. 이번에는 아래처럼 NEW 명령어를 사용해보자.
TypedQuery<UserDTO> query = 
    em.createQuery("SELECT new jpabook.jpql.UserDTO(m.username, m.age)
    FROM Member m", UserDTO.class);
    
List<UserDTO> resultList = query.getResultList();
  • SELECT 다음에 NEW 명령어를 사용하면 반환받을 클래스를 지정할 수 있는데 이 클래스의 생성자에 JPQL 조회 결과를 넘겨줄 수 있다.
  • 그리고 NEW 명령어를 사용한 클래스로 TypeQuery 사용할 수 있어서 지루한 객체 변환 작업을 줄일 수 있다.

 

출처 : JAVA 표준 ORM JPA 프로그래밍 (저자 김영한)

728x90