Java Guides
In the previous tutorial, we have seen how to implement Pagination using Spring Data JPA. In this tutorial, we will learn how to implement Sorting using Spring Data JPA.
Spring Data JPA Sorting Overview
To use paging and sorting APIs provided by Spring Data JPA, your repository interface must extend the PagingAndSortingRepository interface.
PagingAndSortingRepository is an extension of the CrudRepository to provide additional methods to retrieve entities using the pagination and sorting abstraction. It provides two methods :
- Page findAll(Pageable pageable) – returns a Page of entities meeting the paging restriction provided in the Pageable object.
- Iterable findAll(Sort sort) – returns all entities sorted by the given options. No paging is applied here.
@NoRepositoryBean public interface PagingAndSortingRepository < T, ID >extends CrudRepository < T, ID > < /** * Returns all entities sorted by the given options. * * @param sort * @return all entities sorted by the given options */ Iterable < T > findAll(Sort sort); /** * Returns a @link Page> of entities meeting the paging restriction provided in the @code Pageable> object. * * @param pageable * @return a page of entities */ Page < T > findAll(Pageable pageable); >
JpaRepository interface extends the PagingAndSortingRepository interface so if your repository interface is of type JpaRepository , you don’t have to make a change to it.
Iterable < T > findAll(Sort sort);
Note: Spring Data JPA has SimpleJPARepository class which implements PagingAndSortingRepository interface methods so we don’t have to write a code to implement PagingAndSortingRepository interface methods.
Let’s create a Spring boot project from the scratch and let’s implement sorting using Spring Data JPA.
1. Creating Spring Boot Project
Spring Boot provides a web tool called https://start.spring.io to bootstrap an application quickly. Just go to https://start.spring.io and generate a new spring boot project.
Use the below details in the Spring boot creation:
Project Name: spring-data-jpa-course
Choose dependencies: Spring Data JPA, MySQL Driver, Lombok
Package name: net.javaguides.springboot
2. Maven Dependencies
Here is the complete pom.xml for your reference:
project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> modelVersion>4.0.0modelVersion> parent> groupId>org.springframework.bootgroupId> artifactId>spring-boot-starter-parentartifactId> version>3.0.4version>
relativePath/> parent> groupId>net.javaguidesgroupId> artifactId>spring-data-jpa-courseartifactId> version>0.0.1-SNAPSHOTversion> name>spring-data-jpa-coursename> description>Demo project for Spring Bootdescription> properties> java.version>17java.version> properties> dependencies> dependency> groupId>org.springframework.bootgroupId> artifactId>spring-boot-starter-data-jpaartifactId> dependency> dependency> groupId>com.mysqlgroupId> artifactId>mysql-connector-jartifactId> scope>runtimescope> dependency> dependency> groupId>org.springframework.bootgroupId> artifactId>spring-boot-starter-testartifactId> scope>testscope> dependency> dependencies> build> plugins> plugin> groupId>org.springframework.bootgroupId> artifactId>spring-boot-maven-pluginartifactId> plugin> plugins> build> project>
3. Configure MySQL database
Let’s use the MySQL database to store and retrieve the data in this example and we gonna use Hibernate properties to create and drop tables.
spring.datasource.url=jdbc:mysql://localhost:3306/demo?useSSL=false spring.datasource.username=root spring.datasource.password=Mysql@123 spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect spring.jpa.hibernate.ddl-auto = create-drop
4. Create JPA Entity — Product.java
import lombok.*; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; import jakarta.persistence.*; import java.math.BigDecimal; import java.time.LocalDateTime; @Entity @Getter @Setter @NoArgsConstructor @AllArgsConstructor @ToString @Table( name = "products", schema = "ecommerce", uniqueConstraints = < @UniqueConstraint( name = "sku_unique", columnNames = "stock_keeping_unit" ) > ) public class Product < @Id @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "product_generator" ) @SequenceGenerator( name = "product_generator", sequenceName = "product_sequence_name", allocationSize = 1 ) private Long id; @Column(name = "stock_keeping_unit", nullable = false) private String sku; @Column(nullable = false) private String name; private String description; private BigDecimal price; private boolean active; private String imageUrl; @CreationTimestamp private LocalDateTime dateCreated; @UpdateTimestamp private LocalDateTime lastUpdated; >
Note that we are using Lombok annotations to reduce the boilerplate code.
5. Create Spring Data JPA Repository
The next thing we’re gonna do is to create a repository to access Product entity data from the database.
The JpaRepository interface defines methods for all the CRUD operations on the entity, and a default implementation of the JpaRepository called SimpleJpaRepository .
import com.springdatajpa.springboot.entity.Product; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.query.Param; import java.math.BigDecimal; public interface ProductRepository extends JpaRepositoryProduct, Long>
6. Spring Data JPA Sorting Implementation
Let’s write the JUnit test and within the JUnit test, we will write a logic to implement sorting using Spring Data JPA:
import com.springdatajpa.springboot.entity.Product; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.Sort; import java.util.List; @SpringBootTest public class PaginationAndSortingTest < @Autowired private ProductRepository productRepository; @Test void sorting()< String sortBy = "price"; String sortDir = "desc"; Sort sort = sortDir.equalsIgnoreCase(Sort.Direction.ASC.name())? Sort.by(sortBy).ascending(): Sort.by(sortBy).descending(); Listproducts = productRepository.findAll(sort); products.forEach((p) ->< System.out.println(p); >); > >
To apply only sorting in the result set, we need to create a Sort object and pass it to the findAll() method
Sort sort = sortDir.equalsIgnoreCase(Sort.Direction.ASC.name())? Sort.by(sortBy).ascending(): Sort.by(sortBy).descending(); List products = productRepository.findAll(sort);
Output:
Note that Spring Data JPA behind scenes uses Hibernate to generate the below SQL query for sorting:
select product0_.id as id1_0_, product0_.active as active2_0_, product0_.date_created as date_cre3_0_, product0_.description as descript4_0_, product0_.image_url as image_ur5_0_, product0_.last_updated as last_upd6_0_, product0_.name as name7_0_, product0_.price as price8_0_, product0_.stock_keeping_unit as stock_ke9_0_ from products product0_ order by product0_.price desc
Related Spring Data JPA Examples
Learn and master Spring Data JPA at Spring Data JPA Tutorial. // 50+ Spring Data JPA examples