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();
GO TO FULL VERSION