첫번째 페이지 이면서 content의 크기가 한 page size 보다 작을 경우
마지막 페이지 일때 Count 쿼리를 날리지 않고도 Offset과 content 개수로 전체 개수 파악 가능
// 전체 데이터 개수 추출
Long total = jpaQueryFactory.select(expenditure.count())
.from(expenditure)
.where(
expenditure.member.eq(member),
expenditure.spendDate.between(startDate, endDate),
builder // 조건 동적 추가
)
.fetchOne();
return new PageImpl<>(expenditures, pageable, total != null ? total : 0L);
// 전체 데이터 개수 추출
JPAQuery<Long> total = jpaQueryFactory.select(expenditure.count())
.from(expenditure)
.where(
expenditure.member.eq(member),
expenditure.spendDate.between(startDate, endDate),
builder // 조건 동적 추가
);
return PageableExecutionUtils.getPage(expenditures, pageable, total::fetchOne);
fetchOne 람다 메서드
를 실행시키면 해당 페이지만큼의 사이즈만 가져와서 무조건 1페이지만 가져옴1
로서 개수 적용시키려함 -> 실제 데이터 수와 관계 없이 무조건 1페이지만 존재CREATE TABLE orders (
country VARCHAR(10),
status VARCHAR(10)
);
INSERT INTO orders VALUES
('KR', 'NEW'),
('KR', 'NEW'),
('KR', 'DONE'),
('US', 'NEW'),
('US', 'DONE'),
('US', 'DONE');
SELECT country, COUNT(*) AS cnt
FROM orders
GROUP BY country;
total::fetchOne
메서드 실행 결과 처럼 count 쿼리의 결과 (단일행으로 전체 데이터 수)를 따라 하기 위해 아래의 방식으로 변경List<Long> list
= [1, 1, 1, 1, ...., 1] 형태의 리스트 반환list.size()
인 총 1의 개수로 해결// 전체 데이터 개수 추출
JPAQuery<Long> total = jpaQueryFactory.select(expenditure.id, expenditure.count())
.from(expenditure)
.where(
expenditure.member.eq(member),
expenditure.spendDate.between(startDate, endDate),
builder // 조건 동적 추가
)
.groupBy(expenditure.id);
// 기존 : return PageableExecutionUtils.getPage(content, pageable, total::fetchOne);
return PageableExecutionUtils.getPage(content, pageable, () -> total.fetch().size());
// 실제 페이징엔 getPage(content, pageable, supplier) 사용
return PageableExecutionUtils.getPage(content, pageable, () -> {
List<Tuple> rows = grouped.fetch();
// Tuple.get(1, Long.class) 에서 1은 select 열 순서(country=0, count=1)
return rows.stream()
.mapToLong(t -> t.get(1, Long.class))
.sum();
});
이런느낌으로 size()메서드가 아닌 각 리스트를 순회하면서 총 개수를 더해서 넘겨줘야함!