Kritériumok lekérdezése a JPA metamodell használatával

1. Áttekintés

Ebben az oktatóanyagban megvitatjuk a JPA statikus metamodell-osztályainak használatát, miközben a hibakereséseket hibernált állapotban írjuk.

Szükségünk lesz a kritériumok lekérdezésére szolgáló API-k alapismeretére a hibernált állapotban, ezért ha szükséges, olvassa el a Criteria Queries oktatóanyagunkat.

2. Miért éppen a JPA Metamodelje?

Gyakran, amikor kritériumkérdést írunk, hivatkoznunk kell az entitásosztályokra és azok attribútumaira.

Ennek egyik módja az attribútumok nevének megadása stringként. Ennek azonban számos hátránya van.

Először is meg kell keresnünk az entitásattribútumok nevét. És ha egy oszlopnév később megváltozik a projekt életciklusában, akkor minden egyes lekérdezést át kell alakítanunk, ahol a nevet használják.

A JPA metamodelljét a közösség vezette be, hogy elkerülje ezeket a hátrányokat és statikus hozzáférést biztosítson a kezelt entitásosztályok metaadataihoz.

3. Entitásosztály

Vizsgáljuk meg azt a forgatókönyvet, amikor Diákportál-kezelő rendszert építünk egyik ügyfelünk számára, és felmerül egy követelmény a keresési funkciók biztosítására a Diákok érettségi évük alapján.

Először nézzük meg a mi Diák osztály:

@Entity @Table (name = "students") public class Student {@Id @GeneratedValue (strategy = GenerationType.AUTO) private int id; @ Oszlop (név = "keresztnév") privát karakterlánc keresztnév; @ Oszlop (név = "vezetéknév") privát karakterlánc vezetéknév; @Column (név = "grad_year") privát int gradYear; // szabványos mérőeszközök és beállítók}

4. JPA metamodell osztályok létrehozása

Ezután elő kell állítanunk a metamodell osztályokat, és ehhez a JBoss által biztosított metamodell generátor eszközt fogjuk használni. A JBoss csak egy a metamodell létrehozásához rendelkezésre álló számos eszköz közül. További megfelelő eszközök az EclipseLink, az OpenJPA és a DataNucleus.

A JBoss eszköz használatához hozzá kell adnunk a legújabb függőséget pom.xml fájlt, és az eszköz létrehozza a metamodell osztályokat, amint elindítjuk a maven build parancsot:

 org.hibernate hibernate-jpamodelgen 5.3.7.Végső 

Ne feledje, meg kell Add hozzá a cél / generált osztályok mappát az IDE osztályútvonalára, mint alapértelmezés szerint, az osztályok csak ebben a mappában lesznek létrehozva.

5. Statikus JPA metamodell osztályok

A JPA specifikáció alapján egy generált osztály ugyanabban a csomagban fog tartózkodni, mint a megfelelő entitásosztály, és ugyanaz a neve lesz, hozzáadva a „_” -t (aláhúzás) a végén. Így, számára létrehozott metamodell osztály Diák osztály lesz Diák_és úgy néz ki, mint:

@Generated (value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor") @StaticMetamodel (Student.class) public absztrakt osztály Student_ {public static volatile SingularAttribute firstName; public static volatile SingularAttribute lastName; public static volatile SingularAttribute id; public static volatile SingularAttribute gradYear; public static final String FIRST_NAME = "keresztnév"; public static final String LAST_NAME = "vezetékNév"; public static final String ID = "id"; public static final String GRAD_YEAR = "gradYear"; }

6. A JPA Metamodel osztályok használata

A statikus metamodell osztályokat ugyanúgy használhatjuk, mint a Húr hivatkozások az attribútumokra. A feltételek lekérdezés API túlterhelt módszereket biztosít, amelyek elfogadják Húr hivatkozások, valamint Tulajdonság interfész megvalósítások.

Nézzük meg az összeset lekérdező feltételkérdést Diákok aki 2015-ben végzett:

// munkamenet beállítási kódja CriteriaBuilder cb = session.getCriteriaBuilder (); CriteriaQuery criteriaQuery = cb.createQuery (Student.class); Gyökérgyökér = feltételekQuery.from (Student.class); feltételekQuery.select (root) .where (cb.equal (root.get (Student_.gradYear), 2015)); Lekérdezés lekérdezése = session.createQuery (feltételekQuery); Eredmények felsorolása = query.getResultList ();

Figyelje meg, hogyan használtuk a Student_.gradYear referencia helyett a hagyományos grad_year oszlop neve.

7. Következtetés

Ebben a rövid cikkben megtanultuk, hogyan kell használni a statikus metamodell osztályokat, és miért lehet őket előnyben részesíteni a hagyományos módszerekkel szemben Húr a korábban leírt hivatkozások.

Az oktatóanyag forráskódja megtalálható a Github oldalon.