😀서론
테이블 목록을 가져와 목록에서 ID를 통해 내부 정보를 여러 번 조회할 일이 있었다.
쿼리에서 List<Table> 로 조회해서 for문으로 돌리기에는
중복된 ID를 여러 번 조회할 수도 있고, 결국 ID를 통해 다른 값들을 얻고 싶은 게 목표 이기에
QueryDSL에서 return으로 Map도 받을 수 있는지 찾게 되었고, 찾아서 정리를 해본다.
🙄준비
위 데이터를 기준으로 결과 값 확인을 진행합니다.
🙂본론
Querydsl에서는 결과 집합(aggregation) 이라는 걸 제공해주는 걸 알았습니다.
결과 처리 방법
쿼리에서 데이터 조회 후 메모리에서 결과에 대한 집합 연산을 수행하는 집합 함수를 의미 합니다.
간단한 예시로 살펴보겠습니다.
1️⃣Map Value 하나 받기
select는 transform에 있는 필요한 데이터인 id와 quantity 두 개를 조회하는 걸 확인할 수 있었습니다.
2️⃣Map Value 두 개 이상 받기
이번에는 as에 color가 추가 되어서 select 문에도 color가 추가 되었습니다.
com.querydsl.core.group.Group;
as에 두 개 이상이 되면 value에 Group을 사용할 수 있습니다.
😅결론
저는 id를 통해서 name, color 정보를 Map으로 묶기 위해서 Map<String, Group>으로 리턴을 받게 되었고,
해당 Group에 있는 toArray() 메소드를 통해 array를 만든 후 거기서 데이터를 꺼내는 방식으로 해결하였습니다.
찾아보니 이러한 방식을 통해서 @OneToMany 와 같은 연관관계에서도 사용하는 걸 알게 되었습니다.
궁금하시면 아래 글을 읽어보셔도 좋을 것 같습니다.
OneToMany 관계에서 Left Outer Join이 필요할 경우
결과 집합 방식은 더 다양한 결과 값을 얻을 수 있습니다.
더 많은 예제를 확인하고 싶은 분들은 아래 링크를 참고하시면 좋을 것 같습니다.
tabnine
querydsl Github
잘못된 내용이나 추가 내용은 댓글로 남겨주시면 감사하겠습니다 (__)
'JVM > JPA' 카테고리의 다른 글
[Hibernate] 설정 옵션 목록 (0) | 2023.09.19 |
---|---|
[JPA] 트랜잭션 overrideafterCommit, beforeCommit ... (0) | 2023.04.07 |
[JPA] save() isNew를 사용하여 성능개선 하기 (0) | 2021.10.02 |
[QueryDSL]like, contains 차이 (0) | 2021.05.01 |
[QueryDSL] 표현식 정리 (0) | 2021.04.18 |