hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Cấu trúc dữ liệu và giải thuật
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
      • NodeJS
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
      • MongoDB
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
      • Spring Boot
    • Lập trình C#
      • Lập Trình C# Cơ Bản
      • ASP.NET Core MVC
    • Lập trình Python
    • Git và Github
    • Machine Learning
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
    • Mạng và truyền thông
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • Spring Boot
Spring Boot bài 15: Tìm kiếm, phân trang và sắp xếp có kiểm soát
Java và Spring Boot – MVC và REST API

Spring Boot bài 15: Tìm kiếm, phân trang và sắp xếp có kiểm soát

  • 18-10-2026
  • Toanngo92
  • 0 Comments

Giáo trình Spring Boot MVC và REST API · Chương 7/12: Tìm kiếm, phân trang và tài liệu · Bài 15/28 · Biên soạn tháng 10/2026.

← Bài 14 · Mục lục 12 chương · Bài 16 →

Mục lục

  • Mục tiêu bài học
  • Đừng lấy tất cả dữ liệu rồi cắt trong Java
  • Sort cần danh sách cho phép
  • Giữ q, size và sort trong liên kết
  • Kiểm tra cả URL lẫn nội dung
  • Lỗi thường gặp và lưu ý
  • Ghi nhớ
  • Tài liệu đối chiếu

Mục tiêu bài học

Xử lý từ khóa, giới hạn kích thước trang, giữ bộ lọc khi chuyển trang và tạo thứ tự ổn định.

Đừng lấy tất cả dữ liệu rồi cắt trong Java

Danh sách ít bản ghi có thể che giấu cách làm tốn tài nguyên. Với phân trang, database chỉ trả phần dữ liệu cần cho trang hiện tại, còn Page chứa thêm tổng số phần tử và số trang. Spring Data thực hiện truy vấn nội dung và có thể cần truy vấn đếm; với dữ liệu rất lớn, ta sẽ cân nhắc Slice hoặc keyset pagination ở mức nâng cao.

Mẫu dùng page bắt đầu từ 0, size từ 1 đến 50. Client không được yêu cầu size=100000 để tải mọi thứ vào bộ nhớ. q được strip để bỏ khoảng trắng đầu cuối. Tên phương thức findByTitleContainingIgnoreCase thể hiện tìm chứa không phân biệt hoa thường, nhưng hành vi chi tiết còn phụ thuộc database và collation.

Tệp trong mã nguồn mẫu: src/main/java/com/hocvietcode/academy/CourseService.java. Đoạn dưới được trích từ tệp này; xem bản tải về để có đủ import và phần còn lại.

public Page<CourseDto> search(String q,int page,int size,String sort){
    if(page<0 || size<1 || size>50) throw new IllegalArgumentException("Trang hoặc kích thước không hợp lệ");
    String field=List.of("id","title","price").contains(sort)?sort:"id";
    return courses.findByTitleContainingIgnoreCase(q==null?"":q.strip(),PageRequest.of(page,size,Sort.by(field).ascending().and(Sort.by("id")))).map(CourseDto::from);
}

Sort cần danh sách cho phép

Client gửi sort=title hoặc price, nhưng không được tự quyết định bất kỳ tên trường hoặc câu SQL nào. Service chọn từ id, title, price; giá trị không được hỗ trợ quay về id. Có thể chọn trả 400 thay vì fallback, miễn hợp đồng rõ ràng và được kiểm thử.

Khi nhiều khóa học có cùng giá, thêm id làm tiêu chí phụ giúp thứ tự xác định hơn. Phân trang offset vẫn có thể xê dịch nếu dữ liệu được thêm/xóa trong lúc người dùng chuyển trang; tiêu chí phụ không biến nó thành một ảnh chụp cố định của toàn bộ dữ liệu.

Giữ q, size và sort trong liên kết

Nếu đang tìm Java rồi bấm trang tiếp theo nhưng URL mất q, người dùng sẽ thấy danh sách hoàn toàn khác và tưởng phân trang lỗi. Mỗi liên kết phải mang bộ lọc hiện tại. Khi đổi từ khóa hoặc sort, form tìm kiếm không gửi page cũ để quay lại trang đầu.

Đoạn dưới là phần liên kết của template list. Chỉ render nút trước hoặc tiếp khi Page cho biết có trang tương ứng. Với kết quả rỗng, giao diện hiển thị một trạng thái dễ hiểu thay vì trang 1/0.

<a th:if="${result.hasPrevious()}"
   th:href="@{/courses(page=${result.number-1},size=${result.size},q=${q},sort=${sort})}">Trước</a>
<a th:if="${result.hasNext()}"
   th:href="@{/courses(page=${result.number+1},size=${result.size},q=${q},sort=${sort})}">Tiếp</a>

Kiểm tra cả URL lẫn nội dung

Chọn size=1 trên dữ liệu mẫu để thấy ít nhất hai trang. Tìm một từ khóa phù hợp, bấm tiếp và kiểm tra URL vẫn giữ q. Thử page=-1 và size=51 phải nhận lỗi 400 thay vì truy vấn không giới hạn. Nếu page vượt tổng số trang, mẫu trả một trang rỗng; sản phẩm có thể chọn redirect về trang cuối hoặc báo rõ trạng thái.

API dùng PageDto để trả content, page, size, totalElements, totalPages, tránh để cấu trúc JSON phụ thuộc trực tiếp vào implementation Page của thư viện. Giao diện HTML vẫn có thể dùng Page trong model vì đó là chi tiết nội bộ của ứng dụng.

Lỗi thường gặp và lưu ý

  • Phân trang hiển thị từ 1 nhưng tham số xử lý từ 0; đừng cộng/trừ ở cả Controller và template.
  • Không nối q trực tiếp vào SQL; dùng cơ chế tham số của repository hoặc truy vấn được bind.

Ghi nhớ

Phân trang đúng cần dữ liệu đúng, URL giữ trạng thái và giới hạn truy vấn hợp lý, không chỉ có hai nút trước/tiếp.

Tài liệu đối chiếu

  • Paging and Sorting

← Bài 14 · Mục lục 12 chương · Bài 16 →

Bài viết liên quan:

Java và Spring Boot – MVC và REST API
Spring Boot bài 24: Gửi email và lập lịch tác vụ trong Spring Boot
Java và Spring Boot – MVC và REST API
Spring Boot bài 08: Fragment, layout và tài nguyên CSS trong Spring Boot
Java và Spring Boot – MVC và REST API
Spring Boot bài 25: Unit test Service với JUnit và Mockito
Java và Spring Boot – MVC và REST API
Spring Boot bài 09: Binding biểu mẫu tạo và sửa khóa học
Java và Spring Boot – MVC và REST API
Spring Boot bài 26: Integration test MVC, API, database và Security
Java và Spring Boot – MVC và REST API
Spring Boot bài 10: Validation và BindingResult: báo lỗi ngay trên biểu mẫu
Java và Spring Boot – MVC và REST API
Spring Boot bài 27: Logging, Actuator và quản lý schema bằng Flyway
Java và Spring Boot – MVC và REST API
Spring Boot bài 11: Post/Redirect/Get, flash message và session
Java và Spring Boot – MVC và REST API
Spring Boot bài 28: Đóng gói JAR, Docker và cấu hình triển khai
Java và Spring Boot – MVC và REST API
Spring Boot bài 12: JPA Entity, Repository, H2 và migration đầu tiên
Java và Spring Boot – MVC và REST API
Giáo trình Spring Boot MVC và REST API 2026: 12 chương, 28 bài
Java và Spring Boot – MVC và REST API
Spring Boot bài 13: Kết nối MySQL, CRUD và transaction trong Service

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 05: Đơn vị và kích thước: px, rem, %, min và max

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 02: Selector và class: chọn đúng phần tử cần sửa

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 01: Kết nối CSS với HTML và sửa quy tắc đầu tiên

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 20: Hoàn thiện website và sửa lỗi bằng DevTools

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 03: Vì sao CSS không có tác dụng? Cascade và specificity

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×