2.1 Introducere în clasele Query
Apropo, un alt punct important este clasa de ajutor Query. O puteți vedea în acest exemplu:
public List<Employee> getAllEmployes() {
try (Session session = sessionFactory.openSession()) {
Query<Employee> query = session.createQuery("from Employee", Employee.class);
return query.list();
}
}
De fapt, Query este o interfață și are mai multe implementări pentru cazuri diferite. Dar pentru simplitate, voi continua să o numesc o clasă. Aceasta este, să spunem, o clasă în sens larg - în termeni de POO.
Notă. Au fost două clase:
- Interogare pentru a descrie interogarea.
- TypedQuery pentru a descrie o interogare cu un tip cunoscut.
Prima a apărut când Hibernate exista deja și nu existau încă generice. Apoi, după lansarea JDK 5, o altă clasă a fost adăugată la Hibernate - TypedQuery, care deja suporta tastarea rezultatului interogării.
Dar, din câte îmi amintesc, începând cu cea de-a 5-a versiune a Hibernate, a rămas o singură clasă tastata, iar acum se numește Query.
Modul standard de a crea o interogare este:
Query<Employee> query = session.createQuery("from Employee", Employee.class);
Ați învățat cum să creați obiecte de interogare, dar cum executați aceste interogări?
Este și mai simplu aici - numim doar metoda list() pe obiectul Query:
Query<Employee> query = session.createQuery("from Employee", Employee.class);
List<Employee> resultLіst = query.list();
Metoda list() are un sinonim JPA, o metodă care face același lucru, dar se numește getResultList() . Uneori îl puteți vedea în codul scris de alți programatori.
Apropo, dacă interogarea implică că rezultatul va fi într-un singur rezultat, atunci este mai ușor să folosiți metoda uniqueResult() pentru a apela interogarea .
Query<Employee> query = session.createQuery("from Employee where id = 1", Employee.class);
Employee result = query.uniqueResult();
Metoda uniqueResult() are un sinonim JPA, metoda singleResult() . A fost introdus pentru compatibilitatea lui Hibernate cu standardul JPA. El face exact același lucru.
2.2 Metode de interogare a clasei
De fapt, clasa Query are o mulțime de metode diferite. Mai jos voi vorbi despre încă trei dintre ele.
Prima este metoda stream() . Și sinonimul său JPA getResultStream() .
Ambele metode returnează un flux de date în loc de o listă. Această abordare poate fi foarte eficientă atunci când nu aveți nevoie de toate obiectele obținute ca urmare a unei interogări simultan. Sau există posibilitatea ca doar primul dintre ele să fie folosit.
Exemplu:
Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
Stream<Employee> stream = query.stream();
A doua metodă este metoda executeUpdate() . Puteți scrie o interogare care va schimba ceva în baza de date. În acest caz, este necesar ca Hibernate să nu folosească o tranzacție doar în citire atunci când accesează baza de date.
Exemplu de solicitare: am decis să creștem nivelul tuturor utilizatorilor cu 1.
Query<User> query = session.createQuery("update User set level=level+1", User.class);
int count = query.executeUpdate();
Metoda executeUpdate() va returna numărul de rânduri care au fost efectiv modificate.
Și, în sfârșit, a treia metodă este scroll() . Vă vom spune puțin mai multe despre asta.
2.3 Metode de defilare a clasei
Această metodă este oarecum similară cu metoda stream() . Numai că vă permite să treceți prin lista de rezultate fără a scoate deloc rezultatele. Adică, puteți executa o interogare, apoi o derulați la milionul de rând a rezultatului și începeți să citiți datele de acolo.
Un iterator atât de avansat.
Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();
Obiectul ScrollableResults are următoarele metode:
Metodă | Descriere |
---|---|
R obține() | Returnează elementul curent |
Următorul() | Mută indicatorul la următorul element |
anterior() | Mută indicatorul la elementul anterior |
scroll(int size) | Derulați înainte după linii de dimensiune |
poziție (int pos) | Face ca elementul poz number elementul curent |
ultimul() | Elementul actual este acum ultimul |
primul() | Elementul actual este acum primul |
getRowNumber() | Returnează numărul curent al liniei |
setRowNumber() | Setează numărul curent al liniei |
Să presupunem că ați executat o interogare și doriți să obțineți ultimul element. Iată cum să o faci:
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