1. JPA 인터페이스를 사용해 Repository 구현중..
@Repository
public interface ArticleRepository extends JpaRepository<Article, Long> {
Slice<ArticleElement> findAllByOrderByArticleIdDesc(Pageable page);
//findAllOrderByArticleIdDesc 에러남
}
처음에는 findAllOrderByArticleIdDesc라고 짰는데 아래와 같은 에러가 났다.
Reason: Failed to create query for method public abstract org.springframework.data.domain.Slice com.example.kingcar_be.Repository.ArticleRepository.findAllOrderByArticleIdDesc(org.springframework.data.domain.Pageable); No property 'desc' found for type 'Long'; Traversed path: Article.articleId
모든 데이터를 다 가져오면 되어서 findAll 다음에 기준이 되는 By를 안 쓴것인데, ArticleId의 Desc라는 속성으로 정렬하라는 식으로 JPA는 이해한 것 같다. 이유는 아직 잘 모르겠다.
2. DTO
위의 Repository 코드를 보면 나는 Query의 결과를 Article Entity가 아니라 ArticleElement라는 DTO로 받아오고 있다.
@Getter
public class ArticleElement {
private Long articleId; //게시물 Id
private String title; //게시물 제목
private String writerNickname; //게시물 작성자
private String image; //게시물 이미지
private boolean connection; //차주와 시승자 연결 여부
private String writerCarBrand; //차주 자동차 브랜드
private String writerCarModel; //차주 자동차 모델
private int price; //차주가 설정한 금액
}
그랬더니 아래와 같은 에러가 났다.
Specified result type [com.example.kingcar_be.DTO.ArticleElement] did not match Query selection type [com.example.kingcar_be.Entity.Article] - multiple selections: use Tuple or array] with root cause
multiple selections라는 말이 있어서 Article에 List 요소가 있나 확인해봤는데 없었다. 이번 에러는 해결하는데 꽤 오래걸렸다.
다시 코드를 찬찬히 보면서 JPA가 쿼리에서 Article로 받아온 것을 다시 ArticleElement로 변환시켜주는 과정에 대해서 생각해보았다.
그러려면 ArticleElement에 생성자가 필요할 것 같아서 @AllArgsConstructor를 ArticleElement DTO에 추가하니까 해결되었다.
그래도 결국 페이지네이션 다시 한번 구현~!
{
"content": [
{
"articleId": 3,
"title": "드라이브 함께해요",
"writerNickname": "jiwon",
"image": "image.jpg",
"connection": false,
"writerCarBrand": "kia",
"writerCarModel": null,
"price": 80000
},
{
"articleId": 2,
"title": "부럽죠",
"writerNickname": "jiwon",
"image": "naver.com",
"connection": false,
"writerCarBrand": "kia",
"writerCarModel": null,
"price": 70000
}
],
"pageable": {
"pageNumber": 0,
"pageSize": 3,
"sort": {
"empty": true,
"unsorted": true,
"sorted": false
},
"offset": 0,
"paged": true,
"unpaged": false
},
"first": true,
"last": true,
"size": 3,
"number": 0,
"sort": {
"empty": true,
"unsorted": true,
"sorted": false
},
"numberOfElements": 2,
"empty": false
}
한번 해봤던 것이여도 배울 수 있는 것이 많았다!1