Kriterijski upiti koji koriste JPA metamodel

1. Pregled

U ovom vodiču razgovarat ćemo o tome kako koristiti klase JPA statičkih metamodela tijekom pisanja upita s kriterijima u hibernaciji.

Trebat će nam osnovno razumijevanje API-ja za upite kriterija u hibernaciji, pa potražite više informacija o ovoj temi, ako je potrebno, u našem vodiču o kriterijima za upite.

2. Zašto JPA metamodel?

Često kada pišemo upit s kriterijima, moramo se pozivati ​​na klase entiteta i njihove atribute.

Sada je jedan od načina za to pružanje imena atributa kao nizova. Ali, ovo ima nekoliko loših strana.

Kao prvo, moramo potražiti imena atributa entiteta. I, u slučaju da se ime stupca promijeni kasnije u životnom ciklusu projekta, moramo refaktorizirati svaki upit u kojem se koristi ime.

JPA metamodel je uvela zajednica kako bi izbjegla ove nedostatke i omogućila statički pristup metapodacima klasa upravljanih entiteta.

3. Entitetska klasa

Razmotrimo scenarij u kojem gradimo sustav upravljanja studentskim portalom za jednog od naših klijenata, a postavlja se i zahtjev za pružanjem funkcionalnosti pretraživanja na Studenti na temelju njihove diplomske godine.

Prvo, pogledajmo naše Student razred:

@Entity @Table (name = "students") student javnog razreda {@Id @GeneratedValue (strategy = GenerationType.AUTO) private int id; @Column (name = "first_name") private String firstName; @Column (name = "last_name") private String lastName; @Column (name = "grad_year") private int gradYear; // standardni geteri i postavljači}

4. Generiranje klasa JPA metamodela

Dalje, trebamo generirati klase metamodela, a u tu svrhu koristit ćemo alat za generiranje metamodela koji pruža JBoss. JBoss je samo jedan od mnogih alata dostupnih za generiranje metamodela. Ostali prikladni alati uključuju EclipseLink, OpenJPA i DataNucleus.

Da bismo koristili alat JBoss, moramo dodati najnoviju ovisnost u našu pom.xml i alat će generirati klase metamodel nakon što aktiviramo naredbu maven build:

 org.hibernate hibernate-jpamodelgen 5.3.7.Završni 

Napomena, trebamo dodaj ciljne / generirane klase mapu do staze našeg IDE-a, kao po defaultu, klase će se generirati samo u ovoj mapi.

5. Statične klase JPA metamodela

Na temelju JPA specifikacije, generirana klasa nalazit će se u istom paketu kao i odgovarajuća klasa entiteta i imat će isto ime s dodanim "_" (podvlaka) na kraju. Tako, klasa metamodel generirana za Student razred će biti Student_i izgledat će otprilike ovako:

@Generated (value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor") @StaticMetamodel (Student.class) javna apstraktna klasa Student_ {javna statička volatilna SingularAttribute firstName; javna statička volatilna SingularAttribute lastName; javni statički volatile SingularAttribute id; javna statička volatilna SingularAttribute gradYear; javni statički završni niz FIRST_NAME = "firstName"; javni statički završni niz LAST_NAME = "lastName"; javni statički konačni ID niza = "id"; javni statički završni niz GRAD_YEAR = "gradGodina"; }

6. Korištenje klasa JPA metamodel

Klase statičnog metamodela možemo koristiti na isti način kao što bismo koristili Niz reference na atribute. API upita za kriterije nudi preopterećene metode koje prihvaćaju Niz reference kao i Atribut implementacije sučelja.

Pogledajmo upit kriterija koji će dohvatiti sve Studenti koji su diplomirali 2015. godine:

// kod za postavljanje sesije CriteriaBuilder cb = session.getCriteriaBuilder (); CriteriaQuery criteriaQuery = cb.createQuery (Student.class); Korijen korijena = kriterijiQuery.from (Student.class); kriterijiQuery.select (root) .where (cb.equal (root.get (Student_.gradYear), 2015)); Upit upita = session.createQuery (kriterijQuery); Popis rezultata = query.getResultList ();

Primijetite kako smo koristili Student_.gradGod referenca umjesto korištenja konvencionalne grad_godina naziv stupca.

7. Zaključak

U ovom kratkom članku naučili smo kako koristiti statične klase metamodela i zašto im se može dati prednost u odnosu na tradicionalni način upotrebe Niz reference kao što je ranije opisano.

Izvorni kod ovog vodiča možete pronaći na Githubu.


$config[zx-auto] not found$config[zx-overlay] not found