Penomboran, Pengisihan dan Unjuran
Kembalikan hasil bernombor halaman dengan Pageable, isih secara dinamik dan gunakan unjuran antara muka untuk mengehadkan lajur yang diambil.
Penomboran, Pengisihan dan Unjuran ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Mengapa Paginasi?
Memulangkan ribuan baris dalam satu kueri membazirkan memori dan lebar jalur. Paginasi memuatkan satu halaman pada satu-satu masa. Spring Data mengintegrasikan paginasi melalui abstraksi Pageable.
Pageable dan PageRequest
Cipta Pageable menggunakan PageRequest.of(page, size). Hantarkannya kepada mana-mana kaedah repositori yang memulangkan Page<T>.
Pageable pageable = PageRequest.of(0, 20); // page 0, 20 per page
Page<User> page = userRepo.findAll(pageable);
System.out.println("Total: " + page.getTotalElements());
System.out.println("Pages: " + page.getTotalPages());
System.out.println("Content: " + page.getContent().size());Mengisih dengan PageRequest
Tambahkan pengisihan pada PageRequest dengan objek Sort. Rantaikan beberapa medan dengan Sort.by().and().
Pageable sorted = PageRequest.of(0, 20,
Sort.by(Sort.Direction.DESC, "createdAt")
.and(Sort.by("name")));
Page<User> page = userRepo.findAll(sorted);Slice berbanding Page
Page<T> mencetuskan kueri COUNT untuk mengira jumlah halaman. Slice<T> tidak berbuat demikian — ia hanya mengetahui sama ada terdapat halaman seterusnya. Gunakan Slice untuk tatalan tanpa penghujung apabila jumlah rekod tidak diperlukan.
public interface UserRepository extends JpaRepository<User, Long> {
Slice<User> findByStatus(UserStatus status, Pageable pageable);
}Integrasi Spring MVC
Spring MVC menyelesaikan Pageable secara automatik daripada parameter kueri: ?page=0&size=20&sort=name,asc. Tiada penghuraian manual diperlukan.
@GetMapping("/users")
public Page<UserDto> list(Pageable pageable) {
return userRepo.findAll(pageable).map(UserDto::from);
}
// GET /users?page=0&size=10&sort=name,ascProjeksi Antara Muka
Takrifkan antara muka dengan kaedah getter yang sepadan dengan nama medan entiti. Spring Data hanya memulangkan lajur tersebut — sekali gus mengurangkan pemindahan data dan menyembunyikan butiran dalaman.
public interface UserSummary {
Long getId();
String getName();
String getEmail();
}
List<UserSummary> findByStatus(UserStatus status);Projeksi Berasaskan Kelas (DTO)
Gunakan rekod DTO atau kelas dengan pembina. Spring Data menjana ungkapan pembina JPQL untuk lajur yang dipilih.
public record UserDto(Long id, String name, String email) {}
@Query("SELECT new com.example.UserDto(u.id, u.name, u.email) FROM User u WHERE u.status = :s")
List<UserDto> findSummaries(@Param("s") UserStatus status);Projeksi Dinamik
Hantarkan jenis projeksi sebagai parameter generik kepada kaedah repositori untuk memilih projeksi pada tempat panggilan.
public interface UserRepository extends JpaRepository<User, Long> {
<T> List<T> findByStatus(UserStatus status, Class<T> type);
}
// Usage:
List<UserSummary> summaries = repo.findByStatus(ACTIVE, UserSummary.class);
List<User> full = repo.findByStatus(ACTIVE, User.class);Paginasi Berasaskan Kunci (Ofset berbanding Berasaskan Kunci)
Paginasi berasaskan ofset (OFFSET N) merosot prestasinya apabila ofset besar. Paginasi berasaskan kunci (menggunakan WHERE id > lastSeenId) ialah O(1) tanpa mengira kedalaman halaman — lebih baik untuk paginasi yang jauh.
// Keyset pagination:
@Query("SELECT u FROM User u WHERE u.id > :lastId ORDER BY u.id LIMIT :size")
List<User> findPage(@Param("lastId") Long lastId, @Param("size") int size);Pengoptimuman Jumlah Rekod
Gunakan countQuery dalam @Query untuk menyediakan kueri pengiraan yang dioptimumkan dan mengelakkan JOIN yang mahal pada kueri utama.
@Query(value = "SELECT u FROM User u JOIN FETCH u.orders WHERE u.status = :s",
countQuery = "SELECT COUNT(u) FROM User u WHERE u.status = :s")
Page<User> findActiveWithOrders(@Param("s") UserStatus s, Pageable p);Memulangkan ResponseEntity dengan Metadata Halaman
Sertakan metadata halaman (totalElements, totalPages, number, size) dalam respons REST supaya klien mengetahui cara untuk menavigasi.
@GetMapping("/users")
public ResponseEntity<Map<String, Object>> list(Pageable p) {
Page<UserDto> page = repo.findAll(p).map(UserDto::from);
return ResponseEntity.ok(Map.of(
"content", page.getContent(),
"totalElements", page.getTotalElements(),
"totalPages", page.getTotalPages()
));
}Semakan Pantas
Apakah perbezaan utama antara Page dengan Slice?
Ringkasan
Gunakan Pageable+PageRequest.of() untuk paginasi berasaskan ofset. Spring MVC menyelesaikan Pageable daripada parameter kueri. Gunakan Slice untuk mengelakkan COUNT. Gunakan projeksi antara muka atau DTO untuk mengehadkan lajur yang dimuatkan. Gunakan paginasi berasaskan kunci untuk ofset yang besar.
Pelajari Java dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 104
- Pelajaran
- 374
Soalan Lazim
Adakah pelajaran “Penomboran, Pengisihan dan Unjuran” percuma?
Ya — teks penuh “Penomboran, Pengisihan dan Unjuran” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Penomboran, Pengisihan dan Unjuran”?
Kembalikan hasil bernombor halaman dengan Pageable, isih secara dinamik dan gunakan unjuran antara muka untuk mengehadkan lajur yang diambil. Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Java Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Penomboran, Pengisihan dan Unjuran” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Pemetaan Entiti dengan Anotasi JPA
- Repositori Spring Data dan Kaedah Pertanyaan
- Hubungan One-to-Many dan Many-to-Many
- Penomboran, Pengisihan dan Unjuran