Skip to main content

Pagination di Spring Boot dengan JPA dan Hibernate

Pada artikel sebelumnya yang berada pada postingan yang berjudul Spring Data: Implementasi JPA dengan Hibernate pada Spring Boot, kita mencoba membuat Web API berbasis RESTFul sederhana yang melibatkan Spring Boot, JPA, Hibernate dan juga MySQL (atau MariaDB). Kini kita akan menambahkan fitur Pagination pada api http://localhost:8080/users, sehingga user pada awalnya akan selalu menuju halaman pertama secara default dan memilih kehalaman berapa selanjutnya.    


Sebelumnya kita sudah memiliki endpoint yaitu /users untuk menerima POST (create) dan GET (retrieve). Kali ini kita akan menambahkan fitur pagination pada endoint GET /users untuk mendapakan list dari uses yang ada di database dengan kemampuan berpindah halaman dengan menentukan offset setiap halaman.

API saat ini sebelum ada pagination





Pada artikel sebelumnya telah dijelaskan tentang membuat API /users diatas, tepatnnya pada artikel Spring Data: Implementasi JPA dengan Hibernate pada Spring Boot, dan bila perlu code nya ada di repository https://github.com/yoesoff/YBoilerplate.git dengan branch jpa-hibernate. Kode ini sendiri akan di repo yang sama cuma dengan branch jpa-hibernate-pagination.

Kode Sebelumnya pada controller User.

@RestController
@RequestMapping("/users")
public class UserController {

@Autowired
private UserRepository userRepository;

@GetMapping
public List<User> getAllUsers() {
return userRepository.findAll();
}
    
    ...
}


Untuk menambahkan pagination pada fungsi getAllUsers di UserController, Kita dapat menggunakan Pageable dari Spring Data JPA. Berikut adalah langkah-langkahnya:  
  • Tambahkan parameter Pageable pada metode getAllUsers.
  • Ubah return type dari List<User> menjadi Page<User>.
  • Gunakan metode findAll(Pageable pageable) dari UserRepository.
@RestController
@RequestMapping("/users")
public class UserController {

@Autowired
private UserRepository userRepository;

@GetMapping
public Page<User> getAllUsers(Pageable pageable) {
return userRepository.findAll(pageable);
}
    ...
}

Masukan dummy data yang banyak untuk mempermudah proses percobaan, semakin banyak semakin baik.

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(1, '1234567890', 'Garda Bangsa Sejati');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(2, '1234567890', 'Duriah Mutya Sahaja');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(3, '1234567890', 'Abdul Saleh Mapanta');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(4, '1234567890', 'Mahatta Maga Andi');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(5, '1234567890', 'Cellos Nigros Setyosa');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(6, '1234567890', 'Alena Supriadi Rahma');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(7, '1234567890', 'Nur Cahayo Ibadiah');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(8, '1234567890', 'Bimo Androswara Gempita');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(9, '1234567890', 'Bambang Bagus Chandra');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(10, '1234567890', 'Lutvi Rosyadi');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(11, '1234567890', 'Wawan Setiono');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(12, '1234567890', 'Guntur Setiono Langlangbuono');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(13, '1234567890', 'Gempita Cahya Ningsih');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(14, '1234567890', 'Melinda Abdurahman Saleh');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(15, '1234567890', 'Melinda Dulloh');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(16, '1234567890', 'Susilo Aji Satrio');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(17, '1234567890', 'Gorgia Supendi Rahmandanu');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(18, '1234567890', 'Budi Hartanto Suseno');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(19, '1234567890', 'Ronny Coleman LightWeight');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(20, '456789op', 'Rahmawati Nuraeni Magfiroh');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(21, 'passabc', 'Donny Kurnia Supeno');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(22, 'passabc', 'Andika Pratama');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(23, 'pass123', 'Yusuf Ibrahim');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(24, 'pass123', 'Ananda Baskoro Yudhoyono');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(25, 'pass123', 'Amelia Ayu Zahara');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(26, 'pass123', 'Nabila Syakieb');

INSERT INTO yboilerplate.`user`

(id, password, username)

VALUES(27, 'pass123', 'Nikita Willy Suprapto');


Note: Ingat database akan selalu kembali kosong setiap kita me re-run aplikasi kita karena "spring.jpa.hibernate.ddl-auto=createapplication.properties.
spring.application.name=YBoilerplate
spring.datasource.url=jdbc:mysql://localhost:3306/yboilerplate
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect


Ubah page=0 menjadi page=1
Kita perlu merubah ini supaya tidak membingungkan, secara default halaman di mulai dari halaman 0 tapi ini secara umum tidak lazim untuk diihat loleh user, maka kita sebaiknya merubah halaman awal supaya selalu di mulai dari 1.

@RestController
@RequestMapping("/users")
public class UserController {

@Autowired
private UserRepository userRepository;

@GetMapping
public Page<User> getAllUsers(@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "size", defaultValue = "10") int size) {
Pageable pageable = PageRequest.of(page - 1, size);
return userRepository.findAll(pageable);
}

...
}

Atau bila ingin lebh singkat juga bisa menggunakan @PageableDefault seperti contoh di bawah ini (Tetapi mulai tetap dari halaman 0 jadinya).
@RestController
@RequestMapping("/users")
public class UserController {

@Autowired
private UserRepository userRepository;

@GetMapping
public Page<User> getAllUsers(@PageableDefault(page = 0, size = 10) Pageable pageable) {
return userRepository.findAll(pageable);
}

...
}


Selesai semoga membantu.

Clone: https://github.com/yoesoff/YBoilerplate.git  Branch:  jpa-hibernate-pagination





 

Comments

Popular posts from this blog

Numpang Kerja Remote dari Bandung Creative Hub

Semalam kemarin (09 Januari 2019) tidak sengaja kami sekeluarga lewat Bandung Digital Hub saat pulang dari Fish Wow Cheeseee  yang di Jl. Lombok. Bandung Digital Hub ini sendiri berlokasi tidak jauh dari dari tempat kami makan tersebut, yaitu berlokasi di Jl. Laswi No.7, Kacapiring, Batununggal, Kota Bandung, Jawa Barat 40271. Berhubung untuk bulan Januari 2019 ini sedang tidak masuk ke kantor maka saya putuskan untuk besoknya (hari ini 09 Januari 2019) nyoba untuk bekerja remote dari Bandung Digital Hub , apalagi istri yang kebetulan follower pak Ridwan Kamil di Instagram juga Facebook dan tampaknya pernah lihat ulasan mengenai tempat ini sehingga tampak antusias supaya saya datang ketempat ini ini dan mencoba bekerja dari gedung creative hub dan coworking yang keren ini.  Tempat Parkir Masalah utama saat kita datang ke coworking space terutama yang berlokasi di Bandung (atau mungkin kota-kota lainnya) adalah lahan parkir, kadang lahan parkir ...

Numpang Kerja Remote dari Bandung Digital Valley

Satu lagi co-working place  gratisan dan keren yang cukup populer dikota Bandung, co-working place yang juga memberikan fasilitas tempat kerja (co-working place) dan fitur-fitur menarik lainnya,  co-working place keren  ini adalah Bandung Digital Valley atau yang sering disingkat BDV . C o-working place  Bandung Digital Valley ini  merupakan bagian dari Telkom , mulai aktif digunakan dari sekitar tahun 2012 lalu .  Tempat ini biasanya menjadi tempat favorit bagi para pengiat startup, freelancer, dan mahasiswa . Gedung BDV Gedung BDV Gedung BDV Co-working space Bandung Digital Valley ini sendiri berlokasi di Menara Bandung Digital Valley, Jl. Gegerkalong Hilir No.47, Sukarasa, Sukasari, Kota Bandung, Jawa Barat, detailnya bisa dilihat di Google map berikut. Pemandangan jalan setelah pintu satpam. Free Co-working Space Membership Untuk mulai menggunakan fasilitas co-working space ini secara gratis maka yang pe...

Membuat Authentikasi Berbasis Token pada Spring Boot dengan Spring Security dan JWT

Setelah beberapa kali mencari tutorial tentang otentikasi aplikasi web Spring Boot dengan menggunakan JWT yang mudah dipahami akhirnya saya menemukan artikel berbahasa Inggris tapi sangat mudah dipahami  dan diikuti, artikel tersbut berada disini , dengan judul " Spring Boot Token based Authentication with Spring Security & JWT ". Untuk memudahkan orang-orang yang terbiasa membaca artikel dalam bahasa indonesia (termasuk saya sendiri), artikel ini saya buat dan susun ulang (artikel aslinya tidak tertulis dengan runtut dan dapat membuat pemula bingung dengan berbagai error yang muncul) supaya lebih mudah untuk diikuti dan dapat di gunakan bersama. Applikasi yang akan kita buat adalah aplikasi web yang setiap endpoint-nya hanya bisa di akses oleh role tertentu. 1. Tools Yang Diperlukan IntelliJ Idea text editor. Spring Assistant Plugin. Postman. PostgreSQL + DBeaver. Min Java 8 Spring Boot 2.1.8 (dengan Spring Security, Spring Web, Spring Data JPA). jjwt 0.9.1. Maven 3.6.1....