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:
- Hozzon létre egy példányt a Ülés tól SessionFactory tárgy
- Hozzon létre egy C példánytriteriaBuilder felhívásával a getCriteriaBuilder () módszer
- Hozzon létre egy példányt a CriteriaQuery felhívásával a CriteriaBuildercreateQuery () metódus
- Hozzon létre egy példányt a Lekérdezés felhívásával a ÜléscreateQuery () módszer
- 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.