위 게시물의 연장선이다.
동일한 앨범의 댓글은 list에 담아서 출력될 수 있도록 한다.
👉 DTO
우선 dto를 변경했다.
💾 EntertainmentResponseDto.java
package com.example.querydsltest.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EntertainmentResponseDto {
private Long enterId;
private String enterName;
private String artistName;
private String albumName;
private int albumPrice;
private String placeName;
private List<CommentDto> comment = new ArrayList<>();
}
comment를 list에 담기 위해서, comment 관련 필드만 따로 클래스로 뺐다.
그리고 그 자리에 List 타입의 필드를 만들었다.
💾 CommentDto.java
package com.example.querydsltest.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CommentDto {
private String commentUser;
private String comment;
}
추가로 만든 `CommentDto'
👉 Repository
💾 EntertainmantRepositoryImpl.java
package com.example.querydsltest.repository;
import com.example.querydsltest.dto.CommentDto;
import com.example.querydsltest.dto.EntertainmentResponseDto;
import com.example.querydsltest.entity.*;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
import java.util.List;
import static com.querydsl.core.group.GroupBy.list;
import static com.querydsl.core.group.GroupBy.groupBy;
public class EntertainmentRepositoryImpl {
private final JPAQueryFactory queryFactory;
public EntertainmentRepositoryImpl(JPAQueryFactory queryFactory) {
this.queryFactory = queryFactory;
}
QEntertainment qEntertainment = QEntertainment.entertainment;
QArtist qArtist = QArtist.artist;
QAlbum qAlbum = QAlbum.album;
QPlace qPlace = QPlace.place;
QComment qComment = QComment.comment1;
public List<EntertainmentResponseDto> searchList() {
List<EntertainmentResponseDto> result = queryFactory
.from(qEntertainment)
.innerJoin(qArtist).on(qArtist.enterId.enterId.eq(qEntertainment.enterId))
.innerJoin(qAlbum).on(qAlbum.artistId.artistId.eq(qArtist.artistId))
.innerJoin(qPlace).on(qPlace.albumId.albumId.eq(qAlbum.albumId))
.innerJoin(qComment).on(qComment.placeId.placeId.eq(qPlace.placeId))
.transform(
groupBy(qAlbum.albumId).list(
Projections.fields(
EntertainmentResponseDto.class,
qEntertainment.enterId,
qEntertainment.enterName,
qArtist.artistName,
qAlbum.albumName,
qAlbum.albumPrice,
qPlace.placeName,
list(
Projections.fields(
CommentDto.class,
qComment.commentUser,
qComment.comment
)
).as("comment")
)
)
);
return result;
}
}
그리고 위와 같이 코드를 수정한다.
Querydsl까지 변경 후!
스프링부트 3.x 버전에서 실행 시, 에러가 난다면!
위 게시물을 참고한다.
👉 조회
그리고 호출을 해보면!!!
해당 앨범의 댓글은 list에 담겨서 출력이 된다.
전체 출력 결과는 아래에서 확인하면 된다.
💽 전체 출력 결과
더보기
[
{
"enterId": 1,
"enterName": "SM",
"artistName": "동방신기",
"albumName": "Tri-Angle",
"albumPrice": 12000,
"placeName": "예스24",
"comment": [
{
"commentUser": "하늘",
"comment": "최고!!!"
},
{
"commentUser": "미리",
"comment": "재구매!!!"
}
]
},
{
"enterId": 1,
"enterName": "SM",
"artistName": "동방신기",
"albumName": "MIROTIC",
"albumPrice": 15000,
"placeName": "알라딘",
"comment": [
{
"commentUser": "슬기",
"comment": "멋있어요!!!"
}
]
},
{
"enterId": 2,
"enterName": "YG",
"artistName": "빅뱅",
"albumName": "Stand Up",
"albumPrice": 14000,
"placeName": "교보문고",
"comment": [
{
"commentUser": "홍",
"comment": "짱!!!"
}
]
},
{
"enterId": 2,
"enterName": "YG",
"artistName": "빅뱅",
"albumName": "Bigbang Vol.1",
"albumPrice": 13000,
"placeName": "예스24",
"comment": [
{
"commentUser": "민",
"comment": "와우!!!"
}
]
},
{
"enterId": 3,
"enterName": "JYP",
"artistName": "데이식스",
"albumName": "Every DAY6 February",
"albumPrice": 15000,
"placeName": "알라딘",
"comment": [
{
"commentUser": "종이",
"comment": "최고네요!!!"
}
]
},
{
"enterId": 3,
"enterName": "JYP",
"artistName": "데이식스",
"albumName": "The Book of Us : Gravity",
"albumPrice": 10000,
"placeName": "교보문고",
"comment": [
{
"commentUser": "제인",
"comment": "닥치고 구매!!!"
},
{
"commentUser": "데이",
"comment": "미쳤다!!!"
}
]
},
{
"enterId": 4,
"enterName": "하이브",
"artistName": "방탄소년단",
"albumName": "화양연화 Young Forever",
"albumPrice": 13000,
"placeName": "예스24",
"comment": [
{
"commentUser": "미나",
"comment": "귀호강!!!"
}
]
},
{
"enterId": 4,
"enterName": "하이브",
"artistName": "방탄소년단",
"albumName": "WINGS",
"albumPrice": 12000,
"placeName": "알라딘",
"comment": [
{
"commentUser": "큘라",
"comment": "재구매 각!!!"
}
]
}
]
근데 작성을 하다 보니, 구입처 부분이 이상한 걸 발견했다.
placeName 이 같은데도 계속 pk가 늘어난다..
이건 추후에 수정할 수 있도록 해야겠다.
300x250
'Framekwork > SPRING' 카테고리의 다른 글
[SPRING] @BeforeEach @AfterEach 어노테이션 (0) | 2024.04.17 |
---|---|
[Swagger] https 접속 시 해당 서버만 목록에 나오게 하기 (0) | 2024.04.02 |
[스프링부트] Querydsl 사용 테스트 01 (댓글 있는 리스트 전체 조회) (0) | 2024.03.09 |
[스프링부트] Maven Querydsl 설정 및 의존성 추가 (java: cannot access javax.persistence.entitymanager) (0) | 2024.03.08 |
[스프링부트] 자주 사용하는 애노테이션 (Annotation) @NoArgsConstructor , @AllArgsConstructor , @RequiredArgsConstructor (0) | 2024.03.01 |