트러블슈팅

QueryDSL DTO 내부 리스트에 하나의 결과만 조회 되는 문제

삼록이 2025. 8. 31. 18:00
문제.
쿼리 DSL 의
.transform(groupBy())~ 구문에서 dto 내부의 리스트에 여러개의 데이터가 매핑되어야하는데 계속해서 하나의 결과만 가지고 오는 문제가 발생

 

아래와 같은 쿼리 DSL을 DTO에 바로 매핑받을 클래스가 있다.

하나의 아이템에 여러 아이템 이미지링크가 있기 때문에 urls는 List<String>으로 정의해놓았다.

@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class ItemDetailResDto {
    private Long Id;
    private String itemExplanation;
    private String itemName;
    private String itemPrice;
    private List<String> urls;


}

그래서 .transform(groupBy().as())로 한번에 DTO로 매핑되도록 아래와 같은 쿼리를 작성했는데

문제는 분명 데이터상 2개의 url을 받아와야하는데 하나의 url데이터만 계속 받아오는 문제였다.

분명 DB와 쿼리를 확인해봐도 url을 2개를 가지고와야하는데 아래 json데이터를 보면 리스트안에 1개만 가지고 오는 문제가 있었다.

 

챗지피티가 알려주는데로 DTO클래스에 명시적으로 생성자를 선언해보아도 해결되지 않았다.

여러 블로그를 찾아본 결과... 문제는...잘못된 import...

아래와 같이 import가 되어있었는데, 이게 아니라

import static com.querydsl.core.types.Projections.list;

 

이렇게 import를 하는게 맞다...

import static com.querydsl.core.group.GroupBy.list;

 

 

첫번째는 아래처럼 Projection을 여러 개 모아서 배열/리스트처럼 만들어주는 용도...

.select(Projections.list(item.id, item.itemName))
.from(item)
.fetch();

두번째가  groupBy에서 그룹핑된 결과들을 컬렉션(리스트)로 모아주는 역할이다

 

그런데 첫번째 걸로 IDE가 자동 import를 했는데 어떤 오류로 인해 작동은 되는 듯해서
전혀 import쪽에 문제가 있을 거라고 생각을 못했다...

 

이제 결과가 잘 나온다...

 


결론. 쿼리 DSL에서 groupBy를 사용하기 위해서는 아래 첫번째 import가 필요하고,
또 list()를 사용하기 위해서는 아래 두번째 import가 필요하다.
 


 
import static com.querydsl.core.group.GroupBy.groupBy;
import static com.querydsl.core.group.GroupBy.list;



'트러블슈팅' 카테고리의 다른 글

Repeatable Read로 인한 문제  (1) 2025.12.03
정규화 vs 반정규화  (1) 2025.07.19