Hướng dẫn phân trang, sắp xếp trong Spring Data JPA

Hướng dẫn phân trang, sắp xếp trong Spring Data JPA

Giả sử chúng ta truy vấn theo đối tượng Customer sau:

@Entity
@Table(name = "customer")
public class Customer implements Serializable{
  private static final long serialVersionUID = 1L;

  @Id
  @Column(name = "id")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;

  @Column(name = "name")
  private String name;

  @Column(name = "address")
  private String address;

  public Customer() {
  }

  // getter - setter

}

Sắp xếp trong spring data jpa (Sorting)

Để sắp xếp trong spring data jpa ta có khá nhiều cách, ví dụ tìm kiếm tất cả các đối tượng customer và sắp xếp theo thứ tự name giảm dần (DESC)

Đặt tên method (Query Creation)

List<Customer> findAllByOrderByNameDesc();

Sử dụng câu query bên trong @Query

@Query("SELECT e FROM Customer e ORDER BY e.name DESC")
List<Customer> findAll();

Sử dụng tham số Sort trong method:

@Query("SELECT e FROM Customer e")
List<Customer> findAll(Sort sort);

Muốn sắp xếp như nào thì ta sửa tham số sort theo điều kiện đó, ở đây sắp xếp theo name giảm dần sẽ là:

Sort sort = Sort.by("name").descending();

Phân trang trong spring data jpa (Paging)

Để phân trang trong spring data jpa, trong method truy vấn, thay vì trả về 1 stream hay 1 list thì tra trả về 1 page

Ví dụ:

@Query("SELECT e FROM Customer e")
Page<Customer> findCustomers(Pageable pageable);

Trong đó:

  • Pageable sẽ chứa các thông tin phân trang như số phần tử được lấy, vị trí trang được lấy
  • Page sẽ chứa kết quả trả về (gồm số phần tử, danh sách các phần tử)

Pageable là 1 interface, để tạo  nó ta sử dụng PageRequest

Ví dụ tạo pageable với thông tin là page thứ 1với 10 phần tử:

Pageable pageable = PageRequest.of(1, 10);

Ngoài ra bạn cũng có thể sắp xếp các phần tử trong page bằng cách thêm tham số sort vào trong pageable:

Sort sort = Sort.by("name").descending();
Pageable pageable = PageRequest.of(1, 10, sort);

Okay, Done!

Xem thêm: Code ví dụ Spring Data JPA Paging và Sorting

References:

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

stackjava.com