0Pricing
Java Academy · Pelajaran

Paginasi, Pengurutan, dan Proyeksi

Kembalikan hasil berpaginasi dengan Pageable, lakukan pengurutan secara dinamis, dan gunakan proyeksi interface untuk membatasi kolom yang diambil.

Paginasi, Pengurutan, dan Proyeksi adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

Mengapa Menggunakan Paginasi?

Mengembalikan ribuan baris dalam satu kueri memboroskan memori dan bandwidth. Paginasi memuat satu halaman dalam satu waktu. Spring Data mengintegrasikan paginasi melalui abstraksi Pageable.

Pageable dan PageRequest

Buat Pageable menggunakan PageRequest.of(page, size). Teruskan ke metode repositori apa pun yang mengembalikan 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());

Pengurutan dengan PageRequest

Tambahkan pengurutan ke PageRequest dengan objek Sort. Rangkai beberapa bidang 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);

Potongan vs Page

Page<T> menjalankan kueri COUNT untuk menghitung jumlah total halaman. Slice<T> tidak melakukannya — jenis ini hanya mengetahui apakah ada halaman berikutnya. Gunakan Slice untuk gulir tanpa akhir jika jumlah total tidak diperlukan.

public interface UserRepository extends JpaRepository<User, Long> {
    Slice<User> findByStatus(UserStatus status, Pageable pageable);
}

Integrasi Spring MVC

Spring MVC secara otomatis mendapatkan Pageable dari parameter kueri: ?page=0&size=20&sort=name,asc. Tidak diperlukan penguraian manual.

@GetMapping("/users")
public Page<UserDto> list(Pageable pageable) {
    return userRepo.findAll(pageable).map(UserDto::from);
}
// GET /users?page=0&size=10&sort=name,asc

Proyeksi Antarmuka

Definisikan antarmuka dengan metode pengambil yang sesuai dengan nama bidang entitas. Spring Data hanya mengembalikan kolom tersebut — sehingga transfer data berkurang dan detail internal terlindungi.

public interface UserSummary {
    Long getId();
    String getName();
    String getEmail();
}
List<UserSummary> findByStatus(UserStatus status);

Proyeksi Berbasis Kelas (DTO)

Gunakan record atau kelas DTO dengan konstruktor. Spring Data membuat ekspresi konstruktor JPQL untuk kolom 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);

Proyeksi Dinamis

Teruskan jenis proyeksi sebagai parameter generik ke metode repositori untuk memilih proyeksi saat pemanggilan.

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 Berbasis Kunci (Offset vs Keyset)

Paginasi berbasis offset (OFFSET N) menurun kinerjanya pada offset yang besar. Paginasi berbasis kunci (menggunakan WHERE id > lastSeenId) memiliki kompleksitas O(1), terlepas dari kedalaman halaman — sehingga 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);

Optimasi Jumlah Total

Gunakan countQuery dalam @Query untuk menyediakan kueri jumlah yang dioptimalkan dan menghindari 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);

Mengembalikan ResponseEntity dengan Metadata Halaman

Sertakan metadata halaman (totalElements, totalPages, nomor, ukuran) dalam respons REST agar klien mengetahui cara melakukan navigasi.

@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()
    ));
}

Pemeriksaan Singkat

Apa perbedaan utama antara Page dan Potongan?

Ringkasan

Gunakan Pageable+PageRequest.of() untuk paginasi berbasis offset. Spring MVC mendapatkan Pageable dari parameter kueri. Gunakan Slice untuk menghindari COUNT. Gunakan proyeksi antarmuka atau DTO untuk membatasi kolom yang diambil. Gunakan paginasi berbasis kunci untuk offset yang besar.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Paginasi, Pengurutan, dan Proyeksi” gratis?

Ya — teks lengkap “Paginasi, Pengurutan, dan Proyeksi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Paginasi, Pengurutan, dan Proyeksi”?

Kembalikan hasil berpaginasi dengan Pageable, lakukan pengurutan secara dinamis, dan gunakan proyeksi interface untuk membatasi kolom yang diambil. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Paginasi, Pengurutan, dan Proyeksi” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Pemetaan Entitas dengan Anotasi JPA
  2. Repositori Spring Data dan Metode Kueri
  3. Relasi One-to-Many dan Many-to-Many
  4. Paginasi, Pengurutan, dan Proyeksi
← Kembali ke Java Academy