A JPA kritériumainak lekérdezése

1. Áttekintés

Ebben az oktatóanyagban egy nagyon hasznos JPA-funkciót - a Criteria Queries - tárgyalunk.

Ez nem csak lehetővé teszi számunkra a lekérdezések írását nyers SQL elvégzése nélkül, hanem bizonyos objektumorientált vezérlést is biztosít számunkra a lekérdezések felett, ami a Hibernate egyik fő jellemzője. A Criteria API lehetővé teszi számunkra, hogy programozottan hozzunk létre egy feltétel lekérdezési objektumot, ahol különböző szűrési szabályokat és logikai feltételeket alkalmazhatunk.

A Hibernate 5.2 óta a Hibernate Criteria API elavult, és az új fejlesztés a JPA Criteria API-ra összpontosít. Megvizsgáljuk, hogyan lehet a hibernált és a JPA-t használni a kritériumlekérdezések összeállításához.

2. Maven-függőségek

Az API bemutatásához a JPA megvalósítás referenciáját használjuk - Hibernate.

A hibernálás használatához feltétlenül adja hozzá annak legújabb verzióját pom.xml fájl:

 org.hibernate hibernate-core 5.3.2.Végső 

A Hibernate legújabb verziója itt található.

3. Egyszerű példa a kritériumok használatára

Kezdjük azzal, hogy megvizsgáljuk, hogyan lehet adatokat visszakeresni a Criteria lekérdezések segítségével. Megnézzük, hogyan lehet lekérni az adott osztály összes példányát az adatbázisból.

Van egy Tétel osztály, amely a duplát képviseli "TÉTEL" az adatbázisban:

public class Item megvalósítja a Serializable {private Integer itemId; privát String itemName; privát String itemDescription; private Integer itemPrice; // szabványos beállítók és szerelők}

Nézzünk meg egy egyszerű feltételkérdést, amely beolvassa a „TÉTEL" az adatbázisból:

Munkamenet = HibernateUtil.getHibernateSession (); CriteriaBuilder cb = session.getCriteriaBuilder (); CriteriaQuery cr = cb.createQuery (Item.class); Gyökérgyökér = cr.from (Item.class); cr.select (gyökér); Lekérdezés lekérdezése = session.createQuery (cr); Eredmények felsorolása = query.getResultList ();

A fenti lekérdezés egyszerűen bemutatja, hogyan lehet az összes elemet megszerezni. Lássuk, mi történt lépésről lépésre:

  1. Hozzon létre egy példányt a Ülés tól SessionFactory tárgy
  2. Hozzon létre egy C példánytriteriaBuilder felhívásával a getCriteriaBuilder () módszer
  3. Hozzon létre egy példányt a CriteriaQuery felhívásával a CriteriaBuildercreateQuery () metódus
  4. Hozzon létre egy példányt a Lekérdezés felhívásával a ÜléscreateQuery () módszer
  5. Hívja a getResultList () módszere lekérdezés objektum, amely megadja nekünk az eredményeket

Most, hogy áttekintettük az alapokat, térjünk át a feltételkérdezés néhány jellemzőjére:

3.1. Használata Kifejezések

A CriteriaBuilder felhasználható a lekérdezési eredmények korlátozására meghatározott feltételek alapján. Használva FeltételekKérdezés ahol () módszer és biztosítja Kifejezések készítette CriteriaBuilder.

Íme néhány példa a gyakran használtakra Kifejezések:

1000-nél magasabb árú cikkek beszerzése:

cr.select (root) .where (cb.gt (root.get ("itemPrice"), 1000));

Ezután megszerezzük az elemeket darab ár 1000-nél kevesebb:

cr.select (root) .where (cb.lt (root.get ("itemPrice"), 1000));

Tételek, amelyek itemNames tartalmaz Szék:

cr.select (root) .where (cb.like (root.get ("itemName"), "% chair%"));

Rekordok, amelyek darab ár 100 és 200 között:

cr.select (root) .where (cb.between (root.get ("itemPrice"), 100, 200));

Annak ellenőrzése, hogy az adott tulajdonság null:

cr.select (root) .where (cb.isNull (root.get ("itemDescription")));

Annak ellenőrzése, hogy az adott tulajdonság nem null:

cr.select (root) .where (cb.isNotNull (root.get ("itemDescription")));

Használhatja a módszereket is üres() és isNotEmpty () tesztelni, hogy a Lista osztályon belül üres vagy sem.

Most óhatatlanul felmerül a kérdés, hogy a fenti összehasonlítások közül kettőt vagy többet össze tudunk-e kapcsolni vagy sem. A válasz természetesen igen - a Criteria API lehetővé teszi számunkra a kifejezések egyszerű láncolását:

Predikátum [] predikátum = új predikátum [2]; predikátumok [0] = cb.isNull (root.get ("itemDescription")); predikátumok [1] = cb.like (root.get ("itemName"), "szék%"); cr.select (root) .hol (predikátumok);

Két kifejezés hozzáadása logikai műveletekkel:

Predikátum nagyobbThanPrice = cb.gt (root.get ("itemPrice"), 1000); Predikálja a chairItems = cb.like (root.get ("itemName"), "Chair%");

Tételek, amelyekhez kapcsolódnak a fent meghatározott feltételek Logikai VAGY:

cr.select (root) .where (cb.vagy (nagyobbThanPrice, chairItems));

Ahhoz, hogy a fent meghatározott feltételeknek megfelelő elemeket összekapcsoljuk Logikai ÉS:

cr.select (root) .where (cb.és (nagyobbThanPrice, chairItems));

3.2. Válogató

Most, hogy ismerjük a Kritériumok, vessünk egy pillantást a Kritériumok.

A következő példában a listát a név növekvő sorrendjében, majd az ár csökkenő sorrendjében rendeljük meg:

cr.orderBy (cb.asc (root.get ("itemName")), cb.desc (root.get ("itemPrice")));

A következő szakaszban megnézzük, hogyan kell elvégezni az összesített függvényeket.

3.3. Vetületek, összesítések és csoportosítási funkciók

Eddig az alaptémák többségével foglalkoztunk. Most nézzük meg a különböző összesítő függvényeket:

Sorszám lekérése:

CriteriaQuery cr = cb.createQuery (Long.class); Gyökérgyökér = cr.from (Item.class); cr.select (cb.count (root)); Lekérdezés lekérdezése = session.createQuery (cr); Lista itemProjected = lekérdezés.getResultList ();

Az alábbiakban példa az összesített függvényekre:

Összesített funkciója Átlagos:

CriteriaQuery cr = cb.createQuery (Double.class); Gyökérgyökér = cr.from (Item.class); cr.select (cb.avg (root.get ("itemPrice"))); Lekérdezés lekérdezése = session.createQuery (cr); List avgItemPriceList = query.getResultList ();

A rendelkezésre álló egyéb hasznos összesítési módszerek a következők összeg(), max (), perc (), számol() stb.

3.4. CriteriaUpdate

A JPA 2.1-től kezdődően támogatást nyújt az adatbázis-frissítések végrehajtásához a Kritériumok API.

CriteriaUpdate van egy készlet() az adatbázis-rekordok új értékeinek megadásához használható módszer:

CriteriaUpdate criteriaUpdate = cb.createCriteriaUpdate (Item.class); Gyökérgyökér = criteriaUpdate.from (Item.class); feltételekUpdate.set ("itemPrice", newPrice); feltételekUpdate.where (cb.equal (root.get ("itemPrice"), oldPrice)); Tranzakciós tranzakció = session.beginTransaction (); session.createQuery (feltételekUpdate) .executeUpdate (); ügylet.vállalás ();

A fenti részletben létrehozunk egy példányt CriteriaUpdate tól CriteriaBuilder és használja azt készlet() módszer új értékek megadásához a darab ár. Több tulajdonság frissítéséhez csak meg kell hívnunk a készlet() módszer többször.

3.5. CriteriaDelete

CriteriaDelete, amint a neve is mutatja, lehetővé teszi a törlési műveletet a Kritériumok API. Csak arra van szükségünk, hogy létrehozzunk egy példányt CriteriaDelete és használja a hol() módszer a korlátozások alkalmazására:

CriteriaDelete criteriaDelete = cb.createCriteriaDelete (Item.class); Gyökérgyökér = feltételekDelete.from (Item.class); feltételekDelete.where (cb.greaterThan (root.get ("itemPrice"), targetPrice)); Tranzakciós tranzakció = session.beginTransaction (); session.createQuery (feltételekDelete) .executeUpdate (); ügylet.vállalás ();

4. Előny a HQL-hez képest

Az előző szakaszokban kitértünk a Criteria Queries használatára.

Tisztán, a Criteria lekérdezések fő és legnehezebb előnye a HQL-vel szemben a szép, tiszta, objektumorientált API.

Egyszerűen rugalmasabb, dinamikusabb lekérdezéseket írhatunk a sima HQL-hez képest. A logika átalakítható az IDE segítségével, és magában foglalja a Java nyelv összes típusbiztonsági előnyét.

Természetesen vannak hátrányai is, különösen a bonyolultabb csatlakozások körül.

Tehát általában véve a legjobb eszközt kell használnunk a munkához - ez a Criteria API lehet a legtöbb esetben, de mindenképpen vannak olyan esetek, amikor alacsonyabb szintre kell lépnünk.

5. Következtetés

Ebben a cikkben a kritériumlekérdezések alapjaira fókuszáltunk a hibernátumban és a JPA-ban, valamint az API néhány fejlett funkciójára.

Az itt tárgyalt kód a Github adattárban érhető el.