2.1 Introduzione alle classi Query

A proposito, un altro punto importante è la classe Query helper. Potresti vederlo in questo esempio:

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

In effetti, Query è un'interfaccia e ha diverse implementazioni per diversi casi. Ma per semplicità, continuerò a chiamarla classe. Questa è, diciamo, una classe in senso lato, in termini di OOP.

Nota. C'erano due classi:

  • Query per descrivere la query.
  • TypedQuery per descrivere una query con un tipo noto.

Il primo è apparso quando Hibernate esisteva già e non c'erano ancora i generici. Quindi, dopo il rilascio di JDK 5, è stata aggiunta a Hibernate un'altra classe: TypedQuery, che supportava già la digitazione del risultato della query.

Ma, per quanto ricordo, a partire dalla quinta versione di Hibernate, era rimasta solo una classe tipizzata, che ora si chiama Query.

Il modo standard per creare una query è:


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

Hai imparato a creare oggetti Query, ma come esegui queste query?

Qui è ancora più semplice: chiamiamo semplicemente il metodo list() sull'oggetto Query:


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

Il metodo list() ha un sinonimo JPA, un metodo che fa la stessa cosa ma si chiama getResultList() . A volte puoi vederlo nel codice scritto da altri programmatori.

A proposito, se la query implica che il risultato sarà in un unico risultato, allora è più semplice utilizzare il metodo uniqueResult() per chiamare la query .


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

Il metodo uniqueResult() ha un sinonimo JPA, il metodo singleResult() . È stato introdotto per la compatibilità di Hibernate con lo standard JPA. Fa esattamente la stessa cosa.

2.2 Metodi delle classi di interrogazione

In effetti, la classe Query ha molti metodi diversi. Di seguito parlerò di altri tre di loro.

Il primo è il metodo stream() . E il suo sinonimo JPA getResultStream() .

Entrambi questi metodi restituiscono un flusso di dati anziché un elenco. Questo approccio può essere molto efficiente quando non sono necessari tutti gli oggetti ottenuti come risultato di una query contemporaneamente. Oppure c'è la possibilità che venga utilizzato solo il primo.

Esempio:


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

Il secondo metodo è il metodo executeUpdate() . Puoi scrivere una query che cambierà qualcosa nel database. In questo caso, è necessario che Hibernate non utilizzi una transazione di sola lettura quando accede al database.

Esempio di richiesta: abbiamo deciso di aumentare di 1 il livello di tutti gli utenti.


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

Il metodo executeUpdate() restituirà il numero di righe che sono state effettivamente modificate.

E infine il terzo metodo è scroll() . Ti diremo qualcosa in più a riguardo.

2.3 Metodi delle classi di scorrimento

Questo metodo è in qualche modo simile al metodo stream() . Solo ti consente di spostarti nell'elenco dei risultati senza estrarre affatto i risultati. Cioè, puoi eseguire una query, quindi scorrerla fino alla milionesima riga del risultato e iniziare a leggere i dati da lì.

Un iteratore così avanzato.


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

L' oggetto ScrollableResults ha i seguenti metodi:

Metodo Descrizione
R ottieni() Restituisce l'elemento corrente
Prossimo() Sposta il puntatore sull'elemento successivo
precedente() Sposta il puntatore sull'elemento precedente
scorri(dimensione int) Scorri in avanti per linee di dimensione
posizione(int pos) Rende l'elemento pos number l'elemento corrente
scorso() L'elemento corrente è ora l'ultimo
Primo() L'elemento corrente è ora il primo
getNumeroRiga() Restituisce il numero di riga corrente
impostaNumeroRiga() Imposta il numero di riga corrente

Supponiamo che tu abbia eseguito una query e desideri ottenere l'ultimo elemento. Ecco come farlo:


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