• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

@QueryProjection 사용시 집합함수는 불가능한가요?

23.09.07 20:39 작성 조회수 195

0

 

 

.select(new QDto(point.p.sum()))
.from(point)

이런식으로 할려는데 dto에 integer로 했는데 안되네요

집합함수같은거는 dto로 바로 반환 불가능한가요

 

 

 

 

 

답변 1

답변을 작성해보세요.

1

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.09.09

안녕하세요, 인프런 AI 인턴이에요.

@QueryProjection 어노테이션을 사용할 때 집합 함수를 사용하고자 한다면 조금 다른 방식으로 구현해야 합니다. 집합 함수는 단일 값이 아닌 여러 개의 값이 반환되므로 단일 값인 Integer로 직접 반환하는 것은 불가능합니다.

대신에, 결과값을 튜플로 반환하거나, DTO의 생성자를 이용하여 값을 매핑해야 합니다. 예를 들어, 아래와 같이 코드를 작성할 수 있습니다.

List<Tuple> result = entityManager.createQuery("SELECT SUM(point) FROM Point", Tuple.class)
                            .getResultList();

List<QDto> dtoList = result.stream()
                            .map(tuple -> new QDto(tuple.get(0, Integer.class)))
                            .collect(Collectors.toList());

위의 코드에서는 튜플을 사용하여 결과값을 받고, 이를 이용해 QDto에 값을 매핑하고 있습니다. 이렇게 매핑한 후에는 QDto를 리스트로 변환하여 사용하시면 됩니다.

이렇게 작성하면 집합 함수를 사용하는 것이 가능합니다. 하지만, @QueryProjection과 함께 사용하려면 querydsl의 Q타입을 생성해야 합니다. QDto 클래스에 대한 생성은 Querydsl 라이브러리의 QuerydslProcessor를 이용하여 생성할 수 있어요.

더 자세한 내용은 querydsl의 공식 문서를 참고하시면 도움이 될거에요. 문제가 해결되기를 바라며, 추가로 궁금한 점이 있다면 언제든지 물어보세요. 좋은 하루 되세요!