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