2.1 Introduksjon til Query-klassene

Et annet viktig poeng er forresten Query-hjelpeklassen. Du kan se det i dette eksemplet:

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

Faktisk er Query et grensesnitt, og det har flere implementeringer for forskjellige tilfeller. Men for enkelhets skyld vil jeg fortsette å kalle det en klasse. Dette er, la oss si, en klasse i vid forstand – når det gjelder OOP.

Merk. Det pleide å være to klasser:

  • Spørring for å beskrive spørringen.
  • TypedQuery for å beskrive et søk med en kjent type.

Den første dukket opp da Hibernate allerede eksisterte, og det fantes ingen generiske medisiner ennå. Så, etter utgivelsen av JDK 5, ble en annen klasse lagt til Hibernate - TypedQuery, som allerede støttet skriving av søkeresultatet.

Men så vidt jeg husker, fra og med den 5. versjonen av Hibernate, var det bare én maskinskrevet klasse igjen, og den heter nå Query.

Standardmåten for å opprette en spørring er:


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

Du lærte hvordan du oppretter spørringsobjekter, men hvordan utfører du disse spørringene?

Det er enda enklere her - vi kaller bare list() -metoden på Query-objektet:


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

List()- metoden har et JPA-synonym, en metode som gjør det samme, men som kalles getResultList() . Noen ganger kan du se det i kode skrevet av andre programmerere.

Forresten, hvis spørringen antyder at resultatet vil være i et enkelt resultat, er det lettere å bruke unikeResult()- metoden for å kalle spørringen .


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

Metoden uniqueResult() har et JPA-synonym, singleResult() -metoden . Den ble introdusert for Hibernates kompatibilitet med JPA-standarden. Han gjør akkurat det samme.

2.2 Spørringsklassemetoder

Faktisk har Query-klassen mange forskjellige metoder. Nedenfor vil jeg snakke om tre til av dem.

Den første er stream() -metoden . Og dets JPA-synonym getResultStream() .

Begge disse metodene returnerer en strøm av data i stedet for en liste. Denne tilnærmingen kan være svært effektiv når du ikke trenger alle objektene som er oppnådd som et resultat av en spørring på en gang. Eller det er en mulighet for at bare den første av dem vil bli brukt.

Eksempel:


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

Den andre metoden er executeUpdate()- metoden . Du kan skrive en spørring som vil endre noe i databasen. I dette tilfellet er det nødvendig at Hibernate ikke bruker en skrivebeskyttet transaksjon når du får tilgang til databasen.

Eksempel på forespørsel: vi bestemte oss for å heve nivået til alle brukere med 1.


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

executeUpdate() -metoden vil returnere antall rader som faktisk har blitt endret.

Og til slutt er den tredje metoden scroll() . Vi vil fortelle deg litt mer om det.

2.3 Rulleklassemetoder

Denne metoden ligner litt på stream() -metoden . Bare det lar deg gå gjennom resultatlisten uten å trekke ut resultatene i det hele tatt. Det vil si at du kan utføre en spørring, deretter rulle den til den millionte linjen i resultatet og begynne å lese data derfra.

En så avansert iterator.


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

ScrollableResults- objektet har følgende metoder:

Metode Beskrivelse
R får() Returnerer gjeldende element
neste() Flytter pekeren til neste element
tidligere() Flytter pekeren til forrige element
rull (int størrelse) Rull fremover etter størrelseslinjer
posisjon (int pos) Gjør element posnummer til gjeldende element
siste() Det gjeldende elementet er nå det siste
først() Det nåværende elementet er nå det første
get RowNumber() Returnerer gjeldende linjenummer
setRowNumber() Stiller inn gjeldende linjenummer

La oss si at du kjørte en spørring og du vil ha det siste elementet. Slik gjør du det:


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