Kriterier ved brug af JPA Metamodel

1. Oversigt

I denne vejledning diskuterer vi, hvordan du bruger de statiske JPA-metamodelklasser, mens du skriver kriterieforespørgsler i dvale.

Vi har brug for en grundlæggende forståelse af API'er til kriterieforespørgsler i dvale, så tjek vores vejledning om kriterier forespørgsler for at få flere oplysninger om dette emne, hvis det er nødvendigt.

2. Hvorfor JPA Metamodel?

Når vi skriver en kriterieforespørgsel, skal vi ofte henvise til enhedsklasser og deres attributter.

Nu er en af ​​måderne at gøre dette på at angive attributternes navne som strenge. Men dette har flere ulemper.

For det første er vi nødt til at slå op på navnene på enhedsattributter. Og hvis et kolonnenavn ændres senere i projektets livscyklus, skal vi omformulere hver forespørgsel, hvor navnet bruges.

JPA Metamodel blev introduceret af samfundet for at undgå disse ulemper og give statisk adgang til metadataene for de administrerede enhedsklasser.

3. Enhedsklasse

Lad os overveje et scenarie, hvor vi bygger et Student Portal Management-system til en af ​​vores kunder, og et krav opstår for at give søgefunktionalitet på Studerende baseret på deres kandidatår.

Lad os først se på vores Studerende klasse:

@Entity @Table (name = "studerende") offentlig klasse elev {@Id @GeneratedValue (strategi = GenerationType.AUTO) privat int id; @Column (name = "first_name") privat streng fornavn; @Column (name = "last_name") privat streng efternavn; @Column (name = "grad_year") privat int gradYear; // standard getters og setter}

4. Generering af JPA Metamodel-klasser

Dernæst er vi nødt til at generere metamodelklasserne, og til dette formål bruger vi metamodelgeneratorværktøjet leveret af JBoss. JBoss er blot et af de mange tilgængelige værktøjer til at generere metamodellen. Andre egnede værktøjer inkluderer EclipseLink, OpenJPA og DataNucleus.

For at bruge JBoss-værktøjet skal vi tilføje den seneste afhængighed i vores pom.xml fil, og værktøjet genererer metamodelklasser, når vi udløser kommandoen maven build:

 org.hibernate hibernate-jpamodelgen 5.3.7.Final 

Bemærk, det skal vi tilføj mål / genererede klasser mappe til klassestien til vores IDE, som standard genereres klasserne kun i denne mappe.

5. Statiske JPA-metamodelklasser

Baseret på JPA-specifikationen vil en genereret klasse være i samme pakke som den tilsvarende enhedsklasse og have det samme navn med et tilføjet “_” (understregning) i slutningen. Så, metamodelklassen genereret til Studerende klasse vil være Studerende_og vil se ud som:

@Generated (value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor") @StaticMetamodel (Student.class) offentlig abstrakt klasse Student_ {offentlig statisk flygtig SingularAttribute fornavn; offentlig statisk flygtig SingularAttribute efternavn; offentlig statisk flygtig SingularAttribute id; offentlig statisk flygtig SingularAttribute gradYear; offentlig statisk endelig String FIRST_NAME = "fornavn"; offentlig statisk endelig String LAST_NAME = "sidste navn"; offentlig statisk endelig String ID = "id"; offentlig statisk endelig streng GRAD_YEAR = "gradYear"; }

6. Brug af JPA Metamodel-klasser

Vi kan bruge de statiske metamodelklasser på samme måde som vi ville bruge Snor henvisninger til attributter. Kriterieforespørgslen API indeholder overbelastede metoder, der accepterer Snor referencer såvel som Attribut interface implementeringer.

Lad os se på kriterieforespørgslen, der henter alle Studerende der dimitterede i 2015:

// session opsætningskode CriteriaBuilder cb = session.getCriteriaBuilder (); CriteriaQuery criteriaQuery = cb.createQuery (Student.class); Root root = criteriaQuery.from (Student.class); criteriaQuery.select (root) .where (cb.equal (root.get (Student_.gradYear), 2015)); Forespørgsel = session.createQuery (criteriaQuery); Listeresultater = query.getResultList ();

Læg mærke til, hvordan vi har brugt Student_.gradÅr reference i stedet for at bruge det konventionelle afgangsår kolonnenavn.

7. Konklusion

I denne hurtige artikel lærte vi, hvordan man bruger statiske metamodelklasser, og hvorfor de måske foretrækkes frem for den traditionelle måde at bruge Snor referencer som beskrevet tidligere.

Kildekoden til denne vejledning kan findes på Github.


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