2.1 Pambuka kanggo kelas Query

Miturut cara, titik penting liyane yaiku kelas helper Query. Sampeyan bisa ndeleng ing conto iki:

public List<Employee> getAllEmployes() {
    try (Session session = sessionFactory.openSession()) {
            Query<Employee> query = session.createQuery("from Employee", Employee.class);
            return query.list();
    }
}

Nyatane, Query minangka antarmuka lan duwe sawetara implementasine kanggo macem-macem kasus. Nanging kanggo gamblang, aku bakal terus nelpon iku kelas. Iki, ayo ngomong, kelas ing pangertèn sing amba - ing syarat-syarat OOP.

Cathetan. Biyen ana rong kelas:

  • Pitakon kanggo njlèntrèhaké pitakon.
  • TypedQuery kanggo njlèntrèhaké query karo jinis dikenal.

Sing pisanan muncul nalika Hibernate wis ana, lan durung ana generik. Banjur, sawise ngeculake JDK 5, kelas liyane ditambahake menyang Hibernate - TypedQuery, sing wis ndhukung ngetik asil pitakon.

Nanging, kaya sing dakelingake, wiwit versi Hibernate kaping 5, mung siji kelas sing diketik, lan saiki diarani Query.

Cara standar kanggo nggawe Query yaiku:


Query<Employee> query = session.createQuery("from Employee", Employee.class);

Sampeyan sinau carane nggawe obyek Query, nanging kepiye carane nindakake pitakon kasebut?

Iku malah luwih prasaja ing kene - kita mung nelpon dhaftar () cara ing obyek Query:


Query<Employee> query = session.createQuery("from Employee", Employee.class);
List<Employee> resultLіst = query.list();

Cara dhaptar () duwe sinonim JPA, metode sing nindakake perkara sing padha nanging diarani getResultList () . Sampeyan kadhangkala bisa ndeleng ing kode sing ditulis dening programer liyane.

Miturut cara, yen pitakon nuduhake yen asil bakal ana ing asil siji, mula luwih gampang nggunakake metode uniqueResult () kanggo nelpon pitakon kasebut .


Query<Employee> query = session.createQuery("from Employee where id = 1", Employee.class);
Employee result = query.uniqueResult();

Metode uniqueResult() nduweni sinonim JPA, metode singleResult() . Iki dikenalake kanggo kompatibilitas Hibernate karo standar JPA. Dheweke nindakake perkara sing padha.

2.2 Metode kelas pitakon

Nyatane, kelas Query duwe macem-macem cara. Ing ngisor iki aku bakal ngomong babagan telu liyane.

Sing pisanan yaiku metode stream () . Lan JPA sinonim getResultStream() .

Kaloro cara kasebut ngasilake aliran data tinimbang dhaptar. Pendekatan iki bisa dadi efisien banget yen sampeyan ora mbutuhake kabeh obyek sing dipikolehi minangka asil saka pitakon bebarengan. Utawa ana kemungkinan mung sing pisanan sing bakal digunakake.

Tuladha:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
Stream<Employee> stream = query.stream();

Cara kapindho yaiku metode executeUpdate() . Sampeyan bisa nulis pitakon sing bakal ngganti soko ing database. Ing kasus iki, perlu yen Hibernate ora nggunakake transaksi mung diwaca nalika ngakses database.

Panjaluk conto: kita mutusake kanggo ngunggahake level kabeh pangguna kanthi 1.


Query<User> query = session.createQuery("update User set level=level+1", User.class);
int count = query.executeUpdate();

Metode executeUpdate () bakal ngasilake jumlah baris sing wis diowahi.

Lan pungkasane cara katelu yaiku gulung () . Kita bakal pitutur marang kowe sethitik liyane babagan.

2.3 Metode kelas gulung

Cara iki rada padha karo metode stream () . Mung ngijini sampeyan kanggo pindhah liwat dhaftar asil tanpa narik metu asil ing kabeh. Yaiku, sampeyan bisa nglakokake pitakon, banjur gulung menyang baris yuta asil lan miwiti maca data saka kono.

Kaya iterator majeng.


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();

Objek ScrollableResults nduweni metode ing ngisor iki:

Metode Katrangan
R entuk () Ngasilake unsur saiki
sabanjure () Pindhah pointer menyang unsur sabanjure
sadurunge () Pindhah pointer menyang unsur sadurunge
gulung (ukuran int) Gulung maju kanthi garis ukuran
posisi (int pos) Ndadekake nomer pos unsur unsur saiki
pungkasan() Unsur saiki saiki pungkasan
pisanan () Unsur saiki saiki dadi pisanan
getRowNumber() Ngasilake nomer baris saiki
setRowNumber() Nyetel nomer baris saiki

Contone, sampeyan nindakake pitakon lan sampeyan pengin entuk unsur pungkasan. Mangkene carane nindakake:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();
scroll.last();
Employee lastEmployee = scroll.get();