2.1 Pengantar kelas Query
Omong-omong, poin penting lainnya adalah kelas Query helper. Anda bisa melihatnya dalam contoh ini:
public List<Employee> getAllEmployes() {
try (Session session = sessionFactory.openSession()) {
Query<Employee> query = session.createQuery("from Employee", Employee.class);
return query.list();
}
}
Faktanya, Query adalah sebuah antarmuka dan memiliki beberapa implementasi untuk kasus yang berbeda. Tapi untuk kesederhanaan, saya akan terus menyebutnya kelas. Ini, katakanlah, kelas dalam arti luas - dalam hal OOP.
Catatan. Dulu ada dua kelas:
- Kueri untuk mendeskripsikan kueri.
- TypedQuery untuk mendeskripsikan kueri dengan tipe yang diketahui.
Yang pertama muncul ketika Hibernasi sudah ada, dan belum ada obat generik. Kemudian, setelah JDK 5 dirilis, kelas lain ditambahkan ke Hibernate - TypedQuery, yang sudah mendukung pengetikan hasil kueri.
Tapi, seingat saya, dimulai dengan Hibernate versi ke-5, hanya tersisa satu kelas yang diketik, dan sekarang disebut Query.
Cara standar untuk membuat Kueri adalah:
Query<Employee> query = session.createQuery("from Employee", Employee.class);
Anda telah mempelajari cara membuat objek Kueri, tetapi bagaimana Anda menjalankan kueri ini?
Bahkan lebih sederhana di sini - kita cukup memanggil metode list() pada objek Query :
Query<Employee> query = session.createQuery("from Employee", Employee.class);
List<Employee> resultLіst = query.list();
Metode list() memiliki sinonim JPA, metode yang melakukan hal yang sama tetapi disebut getResultList() . Terkadang Anda dapat melihatnya dalam kode yang ditulis oleh pemrogram lain.
Omong-omong, jika kueri menyiratkan bahwa hasilnya akan berupa satu hasil, maka akan lebih mudah menggunakan metode uniqueResult() untuk memanggil kueri .
Query<Employee> query = session.createQuery("from Employee where id = 1", Employee.class);
Employee result = query.uniqueResult();
Metode uniqueResult() memiliki sinonim JPA, metode singleResult() . Itu diperkenalkan untuk kompatibilitas Hibernate dengan standar JPA. Dia melakukan hal yang persis sama.
2.2 Metode kelas kueri
Bahkan, kelas Query memiliki banyak metode yang berbeda. Di bawah ini saya akan berbicara tentang tiga dari mereka.
Yang pertama adalah metode stream() . Dan sinonim JPA-nya getResultStream() .
Kedua metode ini mengembalikan aliran data, bukan daftar. Pendekatan ini bisa sangat efisien ketika Anda tidak membutuhkan semua objek yang diperoleh sebagai hasil kueri sekaligus. Atau ada kemungkinan hanya yang pertama yang akan digunakan.
Contoh:
Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
Stream<Employee> stream = query.stream();
Metode kedua adalah metode executionUpdate() . Anda dapat menulis kueri yang akan mengubah sesuatu di database. Dalam hal ini, Hibernate tidak perlu menggunakan transaksi hanya-baca saat mengakses database.
Contoh permintaan: kami memutuskan untuk menaikkan level semua pengguna sebesar 1.
Query<User> query = session.createQuery("update User set level=level+1", User.class);
int count = query.executeUpdate();
Metode executionUpdate() akan mengembalikan jumlah baris yang sebenarnya telah dimodifikasi.
Dan terakhir metode ketiga adalah scroll() . Kami akan memberi tahu Anda lebih banyak tentang itu.
2.3 Metode kelas gulir
Metode ini agak mirip dengan metode stream() . Hanya ini yang memungkinkan Anda menelusuri daftar hasil tanpa mengeluarkan hasil sama sekali. Artinya, Anda dapat menjalankan kueri, lalu menggulirnya ke baris hasil yang ke-sejuta dan mulai membaca data dari sana.
Iterator yang sangat canggih.
Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();
Objek ScrollableResults memiliki metode berikut:
metode | Keterangan |
---|---|
R dapatkan() | Mengembalikan elemen saat ini |
Berikutnya() | Memindahkan penunjuk ke elemen berikutnya |
sebelumnya() | Memindahkan penunjuk ke elemen sebelumnya |
gulir (ukuran int) | Gulir ke depan menurut garis ukuran |
posisi (int pos) | Membuat nomor pos elemen elemen saat ini |
terakhir() | Elemen saat ini sekarang adalah yang terakhir |
Pertama() | Elemen saat ini sekarang yang pertama |
getRowNumber() | Mengembalikan nomor baris saat ini |
setRowNumber() | Menetapkan nomor baris saat ini |
Katakanlah Anda menjalankan kueri dan ingin mendapatkan elemen terakhir. Inilah cara melakukannya:
Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();
scroll.last();
Employee lastEmployee = scroll.get();
GO TO FULL VERSION