본문 바로가기

Spring

오늘의 질문: jpql 프로젝션 대상이 둘 이상이면 반환 값을 어떻게 받나?

간단한거지만 개념이 헷갈려서 기록해두려 한다.

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 강의에서 프로젝션쪽을 다시 공부해야할 것 같다.