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