Bird
Raised Fist0
Spring Bootframework~5 mins

Pagination and sorting with Pageable in Spring Boot

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction

Pagination helps show data in small parts instead of all at once. Sorting arranges data in order. Pageable makes both easy in Spring Boot.

When you have many database records and want to show only a few per page.
When users want to see data sorted by name, date, or price.
When building a web app that lists items with next and previous buttons.
When you want to reduce loading time by fetching limited data.
When you want to combine sorting and paging in one request.
Syntax
Spring Boot
Pageable pageable = PageRequest.of(pageNumber, pageSize, Sort.by("fieldName").ascending());
Page<Entity> page = repository.findAll(pageable);

PageRequest.of() creates a Pageable object with page number, size, and sort.

Page numbers start at 0, so page 0 is the first page.

Examples
Get first page with 5 items, no sorting.
Spring Boot
Pageable pageable = PageRequest.of(0, 5);
Get second page with 10 items, sorted by name A to Z.
Spring Boot
Pageable pageable = PageRequest.of(1, 10, Sort.by("name").ascending());
Get first page with 20 items, sorted by price high to low.
Spring Boot
Pageable pageable = PageRequest.of(0, 20, Sort.by("price").descending());
Sample Program

This Spring Boot app shows how to get products with pagination and sorting.

The controller method accepts page number, size, sort field, and order from URL parameters.

It creates a Pageable object and fetches a page of products from the database.

The result is a list of products for that page and order.

Spring Boot
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

import java.util.List;

@SpringBootApplication
public class PaginationSortingApp {
    public static void main(String[] args) {
        SpringApplication.run(PaginationSortingApp.class, args);
    }
}

@Entity
class Product {
    @Id
    private Long id;
    private String name;
    private double price;

    public Product() {}

    public Product(Long id, String name, double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public Long getId() { return id; }
    public String getName() { return name; }
    public double getPrice() { return price; }

    @Override
    public String toString() {
        return String.format("Product{id=%d, name='%s', price=%.2f}", id, name, price);
    }
}

interface ProductRepository extends JpaRepository<Product, Long> {}

@RestController
class ProductController {
    private final ProductRepository repository;

    ProductController(ProductRepository repository) {
        this.repository = repository;
    }

    @GetMapping("/products")
    public List<Product> getProducts(
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "5") int size,
            @RequestParam(defaultValue = "name") String sortBy,
            @RequestParam(defaultValue = "asc") String order) {

        Sort sort = order.equalsIgnoreCase("desc") ? Sort.by(sortBy).descending() : Sort.by(sortBy).ascending();
        Pageable pageable = PageRequest.of(page, size, sort);
        Page<Product> productPage = repository.findAll(pageable);
        return productPage.getContent();
    }
}
OutputSuccess
Important Notes

Page numbers start at 0, so the first page is page 0.

Sorting fields must match entity property names exactly.

Use Page.getTotalPages() to know how many pages exist.

Summary

Pageable helps get data in small pages with sorting.

Use PageRequest.of(page, size, sort) to create Pageable.

Combine pagination and sorting in one easy step with Spring Data.

Practice

(1/5)
1. What is the main purpose of using Pageable in Spring Boot?
easy
A. To fetch data in small chunks with optional sorting
B. To connect to the database directly
C. To write SQL queries manually
D. To handle user authentication

Solution

  1. Step 1: Understand Pageable's role

    Pageable is used to request data in pages, not all at once.
  2. Step 2: Recognize sorting feature

    It also supports sorting data by fields while fetching pages.
  3. Final Answer:

    To fetch data in small chunks with optional sorting -> Option A
  4. Quick Check:

    Pageable = Pagination + Sorting [OK]
Hint: Pageable means small pages + sorting [OK]
Common Mistakes:
  • Thinking Pageable connects to database
  • Confusing Pageable with authentication
  • Assuming Pageable writes SQL queries
2. Which of the following is the correct way to create a Pageable object for page 2, size 5, sorted by "name" ascending?
easy
A. PageRequest.of(1, 5, Sort.by("name"))
B. PageRequest.of(2, 5, Sort.asc("name"))
C. PageRequest.of(2, 5, Sort.by("name"))
D. PageRequest.create(2, 5, Sort.by("name"))

Solution

  1. Step 1: Understand zero-based page index

    Page numbers start at 0, so page 2 means index 1.
  2. Step 2: Check method and sorting syntax

    Use PageRequest.of(page, size, Sort.by("field")) for ascending sort.
  3. Final Answer:

    PageRequest.of(1, 5, Sort.by("name")) -> Option A
  4. Quick Check:

    Page index zero-based + Sort.by correct [OK]
Hint: Page index starts at 0, so page 2 is index 1 [OK]
Common Mistakes:
  • Using page number directly instead of zero-based index
  • Using non-existent methods like Sort.asc
  • Using PageRequest.create instead of PageRequest.of
3. Given this repository method call:
repository.findAll(PageRequest.of(0, 3, Sort.by("age")))
What will be the result?
medium
A. Error because Sort direction is missing
B. First 3 records sorted by age descending
C. All records without sorting
D. First 3 records sorted by age ascending

Solution

  1. Step 1: Analyze PageRequest parameters

    Page 0 means first page, size 3 means 3 records, Sort.by("age") defaults to ascending.
  2. Step 2: Understand repository behavior

    findAll with Pageable returns that page of sorted data.
  3. Final Answer:

    First 3 records sorted by age ascending -> Option D
  4. Quick Check:

    Page 0 + size 3 + ascending sort = first 3 sorted [OK]
Hint: Sort.by defaults to ascending if direction not set [OK]
Common Mistakes:
  • Assuming descending sort without direction
  • Thinking all records are returned
  • Expecting error due to missing direction
4. What is wrong with this code snippet?
Pageable pageable = PageRequest.of(1, 10, Sort.asc("date"));
medium
A. Page index should start at 0, not 1
B. Sort.asc() method does not exist
C. Page size cannot be 10
D. PageRequest.of requires 4 parameters

Solution

  1. Step 1: Check Sort method usage

    Spring Data uses Sort.by(), not Sort.asc().
  2. Step 2: Verify other parameters

    Page index 1 and size 10 are valid; PageRequest.of takes 3 parameters here.
  3. Final Answer:

    Sort.asc() method does not exist -> Option B
  4. Quick Check:

    Use Sort.by() for sorting [OK]
Hint: Use Sort.by(), not Sort.asc() [OK]
Common Mistakes:
  • Using Sort.asc() or Sort.desc() which don't exist
  • Thinking page index must be 0 always
  • Believing PageRequest.of needs 4 parameters
5. You want to fetch the third page of size 4, sorted by "price" descending and then by "name" ascending. Which Pageable creation is correct?
hard
A. PageRequest.of(2, 4, Sort.by("price", "name"))
B. PageRequest.of(3, 4, Sort.by("price").descending().and(Sort.by("name")))
C. PageRequest.of(2, 4, Sort.by(Sort.Order.desc("price"), Sort.Order.asc("name")))
D. PageRequest.of(2, 4, Sort.by("price").desc().and(Sort.by("name").asc()))

Solution

  1. Step 1: Identify zero-based page index

    Third page means index 2 (0,1,2).
  2. Step 2: Create Sort with multiple orders

    Use Sort.by(Order.desc("price"), Order.asc("name")) to combine sorting directions.
  3. Step 3: Check syntax correctness

    PageRequest.of(2, 4, Sort.by(Sort.Order.desc("price"), Sort.Order.asc("name"))) uses correct PageRequest.of and Sort.by with orders.
  4. Final Answer:

    PageRequest.of(2, 4, Sort.by(Sort.Order.desc("price"), Sort.Order.asc("name"))) -> Option C
  5. Quick Check:

    Page 2 + size 4 + multi-sort orders correct [OK]
Hint: Use Sort.Order for multi-direction sorting [OK]
Common Mistakes:
  • Using page number 3 instead of index 2
  • Trying to chain .desc() or .asc() methods that don't exist
  • Passing multiple fields without specifying order