2.1 Introduktion til Query-klasserne

Et andet vigtigt punkt er i øvrigt Query-hjælperklassen. Du kan se det i dette eksempel:

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

Faktisk er Query en grænseflade, og den har flere implementeringer til forskellige sager. Men for nemheds skyld vil jeg fortsætte med at kalde det en klasse. Dette er, lad os sige, en klasse i bred forstand – i forhold til OOP.

Bemærk. Der plejede at være to klasser:

  • Forespørgsel for at beskrive forespørgslen.
  • TypedQuery for at beskrive en forespørgsel med en kendt type.

Den første dukkede op, da Hibernate allerede eksisterede, og der var endnu ingen generiske lægemidler. Derefter, efter udgivelsen af ​​JDK 5, blev en anden klasse tilføjet til Hibernate - TypedQuery, som allerede understøttede indtastning af forespørgselsresultatet.

Men så vidt jeg husker, var der fra den 5. version af Hibernate kun én maskinskrevet klasse tilbage, og den hedder nu Query.

Standardmåden at oprette en forespørgsel på er:


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

Du lærte, hvordan du opretter forespørgselsobjekter, men hvordan udfører du disse forespørgsler?

Det er endnu nemmere her - vi kalder 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, der gør det samme, men som kaldes getResultList() . Du kan nogle gange se det i kode skrevet af andre programmører.

Forresten, hvis forespørgslen antyder, at resultatet vil være i et enkelt resultat, så er det lettere at bruge metoden uniqueResult() til at kalde forespørgslen .


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

Metoden uniqueResult() har et JPA-synonym, singleResult() -metoden . Det blev introduceret for Hibernates kompatibilitet med JPA-standarden. Han gør præcis det samme.

2.2 Forespørgselsklassemetoder

Faktisk har Query-klassen en masse forskellige metoder. Nedenfor vil jeg fortælle om tre mere af dem.

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

Begge disse metoder returnerer en strøm af data i stedet for en liste. Denne tilgang kan være meget effektiv, når du ikke har brug for alle de objekter, der er opnået som et resultat af en forespørgsel på én gang. Eller der er mulighed for, at kun den første af dem bliver brugt.

Eksempel:


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

Den anden metode er executeUpdate() metoden . Du kan skrive en forespørgsel, der vil ændre noget i databasen. I dette tilfælde er det nødvendigt, at Hibernate ikke bruger en skrivebeskyttet transaktion, når du får adgang til databasen.

Eksempel på anmodning: vi besluttede at hæve niveauet for alle brugere med 1.


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

Metoden executeUpdate() returnerer antallet af rækker, der faktisk er blevet ændret.

Og endelig er den tredje metode scroll() . Vi vil fortælle dig lidt mere om det.

2.3 Scroll klasse metoder

Denne metode ligner lidt stream() metoden . Kun det giver dig mulighed for at bevæge dig gennem listen over resultater uden overhovedet at trække resultaterne ud. Det vil sige, at du kan udføre en forespørgsel, derefter rulle den til den millionte linje i resultatet og begynde at læse data derfra.

Sådan en avanceret 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å() Returnerer det aktuelle element
Næste() Flytter markøren til det næste element
Tidligere() Flytter markøren til det forrige element
scroll (int størrelse) Rul frem efter størrelseslinjer
position(int pos) Gør element posnummer til det aktuelle element
sidst() Det aktuelle element er nu det sidste
først() Det nuværende element er nu det første
getRowNumber() Returnerer det aktuelle linjenummer
setRowNumber() Indstiller det aktuelle linjenummer

Lad os sige, at du kørte en forespørgsel, og du vil have det sidste element. Sådan gør du:


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