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
'JPA' 카테고리의 다른 글
페치 조인과 일반 조인의 차이(feat. 연관된 엔티티 함께 조회) (0) | 2022.06.15 |
---|---|
페이징 API (0) | 2022.06.15 |
객체지향 쿼리 소개(feat. JPQL) (0) | 2022.06.14 |
지연 로딩(Lazy Loading) - feat. 프록시 (0) | 2022.06.14 |
임베디드 타입(@Embeddable, @Embedded) (0) | 2022.06.13 |