Pageable Deep Dive
Spring Data's Pageable INTERFACE, PAGINATION ko, TRIVIAL bana deta hai — CONTROLLER, page (0-INDEXED) aur size PARAMETERS, AUTOMATICALLY, ACCEPT kar sakta hai, aur, Repository, findAll(Pageable pageable) SE, DIRECTLY, PAGINATED RESULTS, RETURN karti hai.
Page<T>, RETURN TYPE, SIRF DATA hi NAHI, BALKI, METADATA bhi DETA hai — totalElements, totalPages, hasNext(), hasPrevious() — CLIENT, IN VALUES SE, UI mein, "NEXT PAGE" BUTTON DISABLE/ENABLE kar sakta hai, BINA, EXTRA API CALL kiye.
@GetMapping
public Page<ProductDto> getProducts(
@PageableDefault(size = 20, sort = "name") Pageable pageable) {
return productRepository.findAll(pageable).map(this::toDto);
}
// GET /api/products?page=0&size=20&sort=name,asc
// Response:
// {
// "content": [ ...20 products... ],
// "totalElements": 145,
// "totalPages": 8,
// "number": 0, ← current page (0-indexed)
// "size": 20,
// "first": true,
// "last": false
// }- Pageable interface = page/size/sort, AUTOMATICALLY, handle hote hain
- Page<T> = data + metadata (totalElements, totalPages, hasNext)
- @PageableDefault = sensible defaults, agar client, params provide na kare
AGAR, CLIENT, ?size=100000, JAISA, BADA, VALUE, BHEJE, SERVER, OVERWHELM ho sakta hai — @Max VALIDATION, YA, EK, CUSTOM, PageableHandlerMethodArgumentResolver SE, MAXIMUM, PAGE SIZE (jaise, 100), ENFORCE karna, IMPORTANT hai.
@Bean
public PageableHandlerMethodArgumentResolverCustomizer customizer() {
return resolver -> resolver.setMaxPageSize(100);
}Page<T>, TOTAL COUNT (totalElements) CALCULATE karne ke liye, EK, EXTRA, COUNT QUERY, RUN karta hai (PERFORMANCE COST). Slice<T>, YE, COUNT QUERY, SKIP karta hai — SIRF, hasNext() BATATA hai, TOTAL COUNT NAHI — "INFINITE SCROLL" jaise, UI PATTERNS ke liye, ZYAADA, EFFICIENT hai.
- Page<T> = total count SAHIT (EXTRA query, LEKIN, total pages, PATA hai)
- Slice<T> = count query, SKIP — FASTER, infinite scroll ke liye BEHTAR