Kriteriespørsmål ved bruk av JPA Metamodel

1. Oversikt

I denne veiledningen vil vi diskutere hvordan du bruker JPA statiske metamodellklasser mens du skriver kriteriespørsmål i dvalemodus.

Vi trenger en grunnleggende forståelse av API-er for kriteriespørring i dvalemodus, så sjekk ut veiledningen vår om kriteriekrav for mer informasjon om dette emnet, om nødvendig.

2. Hvorfor JPA Metamodel?

Ofte, når vi skriver et kriteriespørsmål, må vi referere til enhetsklasser og deres attributter.

Nå er en av måtene å gjøre dette på å gi attributtenes navn som strenger. Men dette har flere ulemper.

For det første må vi slå opp navnene på entitetsattributter. Og i tilfelle et kolonnenavn endres senere i prosjektets livssyklus, må vi omformulere hvert søk der navnet blir brukt.

JPA Metamodel ble introdusert av samfunnet for å unngå disse ulempene og gi statisk tilgang til metadataene til de administrerte enhetsklassene.

3. Enhetsklasse

La oss se på et scenario der vi bygger et Student Portal Management-system for en av våre kunder, og et krav dukker opp for å tilby søkefunksjonalitet på Studenter basert på konfirmasjonsåret.

La oss først se på vår Student klasse:

@Entity @Table (name = "students") offentlig klasse student {@Id @GeneratedValue (strategi = GenerationType.AUTO) privat int id; @Column (name = "first_name") privat streng fornavn; @Column (name = "last_name") private streng etternavn; @Column (name = "grad_year") privat int gradYear; // standard getters og setters}

4. Generere JPA Metamodel-klasser

Deretter må vi generere metamodellklassene, og for dette formålet bruker vi metamodellgeneratorverktøyet levert av JBoss. JBoss er bare ett av de mange verktøyene som er tilgjengelige for å generere metamodellen. Andre egnede verktøy inkluderer EclipseLink, OpenJPA og DataNucleus.

For å bruke JBoss-verktøyet, må vi legge til den siste avhengigheten i vår pom.xml filen, og verktøyet vil generere metamodellklassene når vi utløser kommandoen maven build:

 org.hibernate hibernate-jpamodelgen 5.3.7.Final 

Merk, vi må Legg til mål / genererte klasser mappen til klassestien til IDE, som standard, genereres klassene bare i denne mappen.

5. Statiske JPA-metamodellklasser

Basert på JPA-spesifikasjonen, vil en generert klasse ligge i samme pakke som den tilsvarende enhetsklassen, og ha samme navn med et “_” (understrek) på slutten. Så, metamodellklassen generert for Student klasse vil være Student_og vil se ut som:

@Generated (value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor") @StaticMetamodel (Student.class) offentlig abstrakt klasse Student_ {offentlig statisk flyktig SingularAttribute fornavn; offentlig statisk flyktig SingularAttribute etternavn; offentlig statisk flyktig SingularAttribute id; offentlig statisk flyktig SingularAttribute gradYear; offentlig statisk finale String FIRST_NAME = "fornavn"; offentlig statisk finale String LAST_NAME = "etternavn"; offentlig statisk slutt String ID = "id"; offentlig statisk sluttstreng GRAD_YEAR = "gradYear"; }

6. Bruke JPA Metamodel-klasser

Vi kan bruke de statiske metamodellklassene på samme måte som vi bruker String referanser til attributter. Kriteriespørrings-API-et gir overbelastede metoder som godtar String referanser så vel som Egenskap grensesnittimplementeringer.

La oss se på kriteriespørringen som vil hente alle Studenter som ble uteksaminert i 2015:

// sesjonskonfigurasjonskode CriteriaBuilder cb = session.getCriteriaBuilder (); CriteriaQuery criteriaQuery = cb.createQuery (Student.class); Rotrot = criteriaQuery.from (Student.class); criteriaQuery.select (root) .where (cb.equal (root.get (Student_.gradYear), 2015)); Query query = session.createQuery (criteriaQuery); Listeresultater = query.getResultList ();

Legg merke til hvordan vi har brukt Student_.grad År referanse i stedet for å bruke det konvensjonelle avgangsår kolonnenavn.

7. Konklusjon

I denne raske artikkelen lærte vi hvordan vi bruker statiske metamodellklasser og hvorfor de kan foretrekkes fremfor den tradisjonelle måten å bruke String referanser som beskrevet tidligere.

Kildekoden til denne veiledningen finner du på Github.


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