2.1 Inleiding tot de Query-klassen

Trouwens, een ander belangrijk punt is de klasse Query-helper. Je zou het in dit voorbeeld kunnen zien:

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

Query is in feite een interface en heeft verschillende implementaties voor verschillende gevallen. Maar voor de eenvoud zal ik het een klasse blijven noemen. Dit is, laten we zeggen, een klasse in brede zin - in termen van OOP.

Opmerking. Vroeger waren er twee klassen:

  • Query om de query te beschrijven.
  • TypedQuery om een ​​query met een bekend type te beschrijven.

De eerste verscheen toen Hibernate al bestond en er nog geen generieke geneesmiddelen waren. Vervolgens, na de release van JDK 5, werd een andere klasse toegevoegd aan Hibernate - TypedQuery, die het typen van het queryresultaat al ondersteunde.

Maar, voor zover ik me herinner, was er vanaf de 5e versie van Hibernate nog maar één getypte klasse over, en die heet nu Query.

De standaardmanier om een ​​Query te maken is:


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

Je hebt geleerd hoe je Query-objecten maakt, maar hoe voer je deze queries uit?

Het is hier nog eenvoudiger - we noemen gewoon de list() methode op het Query-object:


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

De methode list() heeft een JPA-synoniem, een methode die hetzelfde doet, maar getResultList() wordt genoemd . Je kunt het soms zien in code die door andere programmeurs is geschreven.

Trouwens, als de query impliceert dat het resultaat in één resultaat zal zijn, dan is het gemakkelijker om de methode uniqueResult() te gebruiken om de query aan te roepen .


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

De methode uniqueResult() heeft een JPA-synoniem, de methode singleResult() . Het is geïntroduceerd vanwege de compatibiliteit van Hibernate met de JPA-standaard. Hij doet precies hetzelfde.

2.2 Queryklassemethoden

In feite heeft de klasse Query veel verschillende methoden. Hieronder zal ik er nog drie bespreken.

De eerste is de stream() methode . En het JPA-synoniem getResultStream() .

Beide methoden retourneren een gegevensstroom in plaats van een lijst. Deze benadering kan zeer efficiënt zijn wanneer u niet alle objecten die als resultaat van een query zijn verkregen, in één keer nodig hebt. Of er is een mogelijkheid dat alleen de eerste van hen zal worden gebruikt.

Voorbeeld:


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

De tweede methode is de methode executeUpdate() . U kunt een query schrijven die iets in de database verandert. In dit geval is het noodzakelijk dat Hibernate geen alleen-lezen transactie gebruikt bij het benaderen van de database.

Vraag voorbeeld: we hebben besloten om het niveau van alle gebruikers met 1 te verhogen.


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

De methode executeUpdate() retourneert het aantal rijen dat daadwerkelijk is gewijzigd.

En tot slot is de derde methode scroll() . We zullen je er wat meer over vertellen.

2.3 Methoden voor scrollklassen

Deze methode lijkt enigszins op de methode stream() . Alleen hiermee kunt u door de lijst met resultaten bladeren zonder de resultaten eruit te halen. Dat wil zeggen, u kunt een query uitvoeren, deze vervolgens naar de miljoenste regel van het resultaat scrollen en vanaf daar beginnen met het lezen van gegevens.

Zo'n geavanceerde iterator.


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

Het object ScrollableResults heeft de volgende methoden:

Methode Beschrijving
R krijgen() Retourneert het huidige element
volgende() Verplaatst de aanwijzer naar het volgende element
vorig() Verplaatst de aanwijzer naar het vorige element
scroll (int grootte) Blader vooruit op maatlijnen
positie(int pos) Maakt het pos-nummer van het element het huidige element
laatst() Het huidige element is nu het laatste
Eerst() Het huidige element is nu het eerste
getRijNummer() Retourneert het huidige regelnummer
setRijNummer() Stelt het huidige regelnummer in

Stel dat u een query hebt uitgevoerd en dat u het laatste element wilt ophalen. Hier is hoe het te doen:


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