Java Academy · Pelajaran

Penomboran, Pengisihan dan Unjuran

Kembalikan hasil bernombor halaman dengan Pageable, isih secara dinamik dan gunakan unjuran antara muka untuk mengehadkan lajur yang diambil.

Pelajaran 4 daripada 413 langkah

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,asc

Projeksi 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.

Percuma untuk bermula

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

  1. Pemetaan Entiti dengan Anotasi JPA
  2. Repositori Spring Data dan Kaedah Pertanyaan
  3. Hubungan One-to-Many dan Many-to-Many
  4. Penomboran, Pengisihan dan Unjuran
← Kembali ke Java Academy