겪은 문제

PropertyReferenceException: No property 'created' found for type 'Post'; Did you mean 'createdAt’

 

이 에러가 계속 떠서 어디서 발생하는 에러지? 하고 보니 findByTitleContainingAndCreatedAtBetween 쿼리 메서드를 호출할 때 발생했다.

    public PostsResponseDto getPosts(int page, String sortTypeStr, String search, String start, String end) {
        SortType sortType = SortType.fromColumn(sortTypeStr);
        Sort sort = Sort.by(sortType.getColumn());
        Pageable pageable = PageRequest.of(page, 10, sort);

        search = search != null ? search : "";
        LocalDateTime startDate = start != null ?
                LocalDate.parse(start, DateTimeFormatter.ISO_DATE_TIME).atStartOfDay() : LocalDateTime.MIN;
        LocalDateTime endDate = end != null ?
                LocalDate.parse(end, DateTimeFormatter.ISO_DATE_TIME).atTime(LocalTime.MAX) : LocalDateTime.MAX;
        Page<Post> posts = postRepository.findByTitleContainingAndCreatedAtBetween(search, startDate, endDate, pageable);

        List<PostGetResponseDto> postGetResponseDtoList = posts.map(PostGetResponseDto::new).getContent();
        if(posts.getTotalElements() > 0 && postGetResponseDtoList.isEmpty()) {
            throw new BusinessException(ErrorCode.POST_NOT_FOUND);
        }

        return PostsResponseDto.builder().page(page)
                .data(postGetResponseDtoList)
                .build();
    }

그래서 난 이 JPA 쿼리 메서드가 잘못된 줄 알고 CreatedAt이 왜 파싱이 안되는 거지? 하고 계속 뜯어 봤다.

그런데 아무리 봐도 메서드에는 이상이 없는 것이다.

 

애초에 메서드에 이상이 있었다면 런 하자마자 메서드를 구현하기 때문에...

그 때 에러가 났었어야 한다.

 

 

원인

        SortType sortType = SortType.fromColumn(sortTypeStr);
        Sort sort = Sort.by(sortType.getColumn());

 

황당하게도 원인은 정렬 기준을 정하는 곳이었다.

@Getter
@RequiredArgsConstructor
public enum SortType {
    CREATED_AT("created_at"),
    LIKE("like");

    private final String value;
}

 

정렬할 칼럼 이름이 created_at이라 되어 있다.

그러나 Hibernate에서 에서 파싱할 때 자바 카멜 → DB 스네이크로 변환을 해준다.

스네이크로 표기가 되어 있어서 created까지만 잘려 파싱 에러 난 것.

 

 

해결

@Getter
@RequiredArgsConstructor
public enum SortType {
    CREATED_AT("createdAt"),
    LIKE("like");

    private final String value;
}

 

카멜 표기법으로 변경을 해주면 지가 알아서 파싱 잘 해준다.

+ Recent posts