728x90
이 코드의 목적
제목, 글쓴이, 제목 + 내용을 통한 게시글 검색 기능입니다.
이 오류는 왜 발생했을까?
먼저 QueryDSL을 작성한 코드를 보겠습니다.
public Page<PostListResponseDto> search(PostSearchCondition condition, Pageable pageable) {
List<PostListResponseDto> content = queryFactory
.select(Projections.constructor(PostListResponseDto.class,
post.id,
user.id,
user.nickname,
post.thumbnail,
post.title,
post.content,
post.hits,
post.category,
post.comment.size(),
post.postLike.size(),
post.createAt))
.from(post)
.leftJoin(post.user, user)
.where(
postWriterEq(condition.getPostWriter()),
titleEq(condition.getTitle()),
postContentEq(condition.getPostContent())
// commentWriter(condition.getCommentWriter()),
// commentContent(condition.getCommentContent())
)
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
JPAQuery<Long> countQuery = queryFactory
.select(post.count())
.from(post)
.leftJoin(post.user, user)
.where(
postWriterEq(condition.getPostWriter()),
titleEq(condition.getTitle()),
postContentEq(condition.getPostContent())
// commentWriter(condition.getCommentWriter()),
// commentContent(condition.getCommentContent())
);
return PageableExecutionUtils.getPage(content, pageable, () -> countQuery.fetchOne());
}
@Getter
public class PostListResponseDto {
private Long postId;
private Long userId;
private String nickname;
private String thumbnail;
private String title;
private String content;
private Long hits;
private Category category;
private Long commentCount;
private Long likeCount;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime createAt;
private List<String> hashTag = new ArrayList<>();
public PostListResponseDto(Post post, int commentCount, int likeCount) {
this.postId = post.getId();
this.userId = post.getUser().getId();
this.nickname = post.getUser().getNickname();
this.thumbnail = post.getThumbnail();
this.title = post.getTitle();
this.content = post.getContent();
this.hits = post.getHits();
this.category = post.getCategory();
this.commentCount = (long)commentCount;
this.likeCount = (long)likeCount;
this.createAt = post.getCreateAt();
this.hashTag = post.getHashTag().stream()
.map(t -> t.getTag().getName())
.collect(Collectors.toList());
}
}
문제 발생!
이 문제는 QueryDSL의 Repository와 DTO의 필드가 일치하지 않아서 발생하는 문제입니다.
- 필드의 값이 존재하지 않을 때
위 사진과 같이 hashTag값이 없기 때문에 발생하는 문제입니다. - 필드의 값은 존재하지만, 위치가 다를 때
실험을 위한 새로운 DTO와, QueryDSL입니다.
해결방법
가벼운 테스트를 위해 DTO를 생성했습니다.
DTO에 맞는 메소드를 만들어서 진행하겠습니다.
정상적으로 실행되는 모습입니다.
이번 포스팅을 계기로 문제점이 무엇인지,
어떻게 해결할 수 있는지 확실하게 알 수 있었습니다.
다음 포스팅은 HashTag를 어떻게 처리했는지에 대한 내용을 다루겠습니다.
728x90
'Spring > 오류' 카테고리의 다른 글
org.opentest4j.AssertionFailedError: Jacoco를 사용하면서 겪은 간단한 에러 (0) | 2023.05.23 |
---|---|
No enum constant: QueryDSL에서 Enum타입을 어떻게 받아서 처리할 수 있을까? (0) | 2023.04.01 |
JPA: Parameter value [1] did not match expected type (0) | 2023.03.21 |
JPA Error: 흔히 접할 수 있는 에러 could not initialize proxy - no Session (0) | 2023.02.27 |
org.hibernate.PersistentObjectException: detached entity passed to persist (0) | 2023.02.07 |