JPA 에서 제공하는 Page를 사용하고 싶은데
데이터를 가공해서 사용하다 보니 List 로 결과가 나오고 있어서
List를 Page로 변환해서 사용하고자 한다.
아래 코드를 참고해서 List 를 Page로 변환해서 사용하면 된다.
방법1
Page<CompanyResponse.CompanyDto> pageResult = (Page<CompanyResponse.CompanyDto>) PageUtils.makePageResponse(list, pageable);
페이징 처리를 위한 공통 코드
public static Page<?> makePageResponse(List<?> list, Pageable paging, int totalCount) {
try {
return (new PageImpl<>(list, paging, totalCount));
} catch (Exception e) {
return (new PageImpl<>(new ArrayList<>(), paging, totalCount));
}
}
응답값
@Getter
@SuperBuilder
public class CompanyResponse extends PagingDto {
private final List<CompanyDto> companyDtos;
@Data
@Builder
public static class CompanyDto {
@Schema(name = "회사 아이디")
private Long companyId;
@Schema(name = "회사명")
private String companyName;
}
}
응답값에서 사용하는 페이지 DTO
@Getter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class PagingDto {
@Builder.Default
private int size = 15;
@Builder.Default
private int page = 1;
@Builder.Default
private long totalCount = 0;
@Builder.Default
private int totalPages = 0;
}
방법2
위의 방법으로 안될때는 아래 내용처럼 페이징 처리를 위한 값을 하나씩 다 처리해서 사용해도 된다.
List<Company> listResult = companyRepotiroy.findAllByName(name);
// 요청으로 들어온 page와 한 page당 원하는 데이터의 갯수
PageRequest pageRequest = PageRequest.of(page, size);
int start = (int) pageRequest.getOffset();
int end = Math.min((start + pageRequest.getPageSize()), listResult.size());
nt totalCount = listResult.size() < pageable.getPageSize() ? 1 : (int) Math.ceil((double) listResult.size() / pageable.getPageSize()); // 페이지 사이즈에 따른 페이지 전체 카운트
Page<Company> userPage = new PageImpl<>(listResult.subList(start, end), pageRequest, listResult.size());
참고
반응형
'백엔드 > Spring' 카테고리의 다른 글
[JPA] Swagger Error - [Request processing failed; nested exception is java.lang.NullPointerException] with root cause (0) | 2023.08.16 |
---|---|
[Spring] Spring HATEOAS란 (0) | 2023.08.10 |
[JPA] JsonMappingException: Infinite recursion (StackOverflowError) 오류 (0) | 2023.08.03 |
실전! 스프링 데이터 JPA 내용 정리 - 섹션 4(1) (0) | 2023.08.02 |
[JPA] COALESCE - @Query에서 sum()사용시 Null 을 0으로 (0) | 2023.05.19 |