2.1 Bevezetés a Query osztályokba

Egyébként egy másik fontos pont a Query helper osztály. Ebben a példában láthatta:

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

Valójában a Query egy interfész, és számos megvalósítása van különböző esetekre. De az egyszerűség kedvéért továbbra is osztálynak fogom hívni. Ez mondjuk egy osztály tág értelemben – az OOP szempontjából.

Jegyzet. Régebben két osztály volt:

  • Lekérdezés a lekérdezés leírásához.
  • TypedQuery egy ismert típusú lekérdezés leírásához.

Az első akkor jelent meg, amikor a Hibernate már létezett, és még nem voltak generikusok. Aztán a JDK 5 megjelenése után egy újabb osztály került a Hibernate-be - TypedQuery, amely már támogatta a lekérdezés eredményének begépelését.

De ha jól emlékszem, a Hibernate 5. verziójától kezdődően csak egy gépelt osztály maradt meg, ennek neve most Query.

A lekérdezés létrehozásának szokásos módja a következő:


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

Megtanulta lekérdezési objektumok létrehozását, de hogyan hajtja végre ezeket a lekérdezéseket?

Itt még egyszerűbb – csak meghívjuk a list() metódust a Query objektumon:


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

A list() metódusnak van egy JPA szinonimája, amely ugyanazt csinálja, de getResultList() -nek hívják . Néha láthatja más programozók által írt kódban.

Mellesleg, ha a lekérdezés azt sugallja, hogy az eredmény egyetlen eredményben lesz, akkor egyszerűbb az egyediResult() metódus használata a lekérdezés meghívására .


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

Az uniqueResult() metódusnak van egy JPA szinonimája, a singleResult() metódus . Azért vezették be, hogy a Hibernate kompatibilis legyen a JPA szabvánnyal. Pontosan ugyanazt csinálja.

2.2 Osztálymetódusok lekérdezése

Valójában a Query osztálynak sok különböző módszere van. Az alábbiakban ezek közül további háromról beszélek.

Az első a stream() metódus . És a JPA szinonimája getResultStream() .

Mindkét módszer lista helyett adatfolyamot ad vissza. Ez a megközelítés nagyon hatékony lehet, ha nincs szüksége a lekérdezés eredményeként kapott összes objektumra egyszerre. Vagy fennáll annak a lehetősége, hogy ezek közül csak az első kerül felhasználásra.

Példa:


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

A második módszer az executeUpdate() metódus . Írhat egy lekérdezést, amely megváltoztat valamit az adatbázisban. Ebben az esetben szükséges, hogy a Hibernate ne használjon csak olvasható tranzakciót az adatbázis elérésekor.

Példa kérésre: úgy döntöttünk, hogy az összes felhasználó szintjét 1-gyel emeljük.


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

Az executeUpdate() metódus a ténylegesen módosított sorok számát adja vissza.

És végül a harmadik módszer a scroll() . Kicsit többet mesélünk róla.

2.3 Osztálymetódusok görgetése

Ez a módszer némileg hasonlít a stream() metódushoz . Csak ez teszi lehetővé, hogy az eredmények listája között mozogjon anélkül, hogy kihúzná az eredményeket. Vagyis végrehajthat egy lekérdezést, majd görgetheti az eredmény milliomod soráig, és onnan kezdheti el az adatok beolvasását.

Egy ilyen fejlett iterátor.


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

A ScrollableResults objektum a következő módszerekkel rendelkezik:

Módszer Leírás
R get() Az aktuális elemet adja vissza
következő() A mutatót a következő elemre mozgatja
előző() A mutatót az előző elemre mozgatja
görgetés (int méret) Görgessen előre a méretsorokkal
pozíció (int pos) A pos elemet az aktuális elemmé teszi
utolsó() Az aktuális elem most az utolsó
első() Az aktuális elem most az első
getRowNumber() Az aktuális sorszámot adja vissza
setRowNumber() Beállítja az aktuális sor számát

Tegyük fel, hogy futtatott egy lekérdezést, és az utolsó elemet szeretné megkapni. Íme, hogyan kell csinálni:


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