[스프링부트] Querydsl 사용 테스트 01 (댓글 있는 리스트 전체 조회)
Querydsl에 대해 찾아보고, 적용해 본 후? 내가 직접 간단한 설계를 해보고, Querydsl까지 적용해보고 싶다는 생각을 했다. 물론 너무 복잡한 건 아직 무리이다. 그리고 이번에 이 연습을 하면서 느낀
devje.tistory.com
위 게시물의 연장선이다.
동일한 앨범의 댓글은 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 버전에서 실행 시, 에러가 난다면!
[ERROR] java.lang.Object org.hibernate.ScrollableResults.get(int) (Querydsl transform)
org.springframework.boot spring-boot-starter-parent 3.2.3 17 스프링부트와 자바 버전은 위와 같다. 2024-03-09T20:11:37.815+09:00 ERROR 14104 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatche
devje.tistory.com
위 게시물을 참고한다.
👉 조회
그리고 호출을 해보면!!!
해당 앨범의 댓글은 list에 담겨서 출력이 된다.
전체 출력 결과는 아래에서 확인하면 된다.
💽 전체 출력 결과
근데 작성을 하다 보니, 구입처 부분이 이상한 걸 발견했다.
placeName 이 같은데도 계속 pk가 늘어난다..
이건 추후에 수정할 수 있도록 해야겠다.
'SOMEDAY > JAVA' 카테고리의 다른 글
[JAVA] 이메일 유효성 검사 정규표현식 (0) | 2024.04.03 |
---|---|
[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 |