간단한거지만 개념이 헷갈려서 기록해두려 한다.
SQL에서는 select 절에 여러 값을 반환받을 수 있다. 그렇다면 jpql에서는 어떻게 반환받아야 하나?
반환 값이 하나라면 select [변수명] from 객체 선언... 으로 간단하게 가져올 수 있는데 여러 개는 처음이라 헷갈렸다.
생각했던 방법은 크게 두가진데
첫 째 Query Projection용 DTO 클래스를 사용한다. jpa 강의에서 배운 방법이지만, Infra 영역이 DTO에 의존하게 되어 꺼려졌다. 뿐만 아니라 DTO 특성상 다른 레이어에 의존 관계가 생겨서 별로 좋지 못한 방법같았다.
둘 째 자바의 Object[] 타입으로 받는다.
참고: https://stackoverflow.com/questions/6877857/jpa-query-that-returns-multiple-entities
JPA: Query that returns multiple entities
I'm writing a JPQL query that joins across three tables. In my resultlist I would like to get all three entities per matching row (hope that makes sense). Any ideas? Hibernate 3.x is my JPA provi...
stackoverflow.com
반환 타입을 List<Object[]>로 받고, 타입 캐스팅으로 원하는 데이터를 얻는다. 나의 경우 stream을 사용하여 for문을 최대한 지양하려 했다. 이게 최선인듯?
public GetManagerListDto getManagersInfo(long courseId) {
return new GetManagerListDto(managerRepository
.findAllManagerInfoByCourseId(courseId).stream()
.map(o -> {
Manager m = (Manager) o[0];
User u = (User) o[1];
return new GetManagerDto(m.getId(), u.getName(),
u.getDepartment(), m.getManagerId(), m.getEmail());
}).collect(Collectors.toList()));
}
추가로 jpa 강의에서 프로젝션쪽을 다시 공부해야할 것 같다.
'Spring' 카테고리의 다른 글
SpringSecurity + CustomAuthenticationProvider 만들기 (0) | 2022.01.11 |
---|---|
Filter, Interceptor, AOP 차이에 대한 정리 (0) | 2021.11.22 |
오늘의 질문 : JPA 엔티티 수정 방식 (0) | 2021.08.10 |
DDD를 위한 일대다 연결관계 매핑 (0) | 2021.08.09 |
JPA 생성 날짜, 수정 날짜 자동으로 넣어주기 (0) | 2021.07.16 |