Kartlegge en dvale-spørring til en tilpasset klasse

1. Oversikt

Når vi bruker dvalemodus for å hente data fra databasen, bruker den som standard de hentede dataene til å konstruere hele objektgrafen for ønsket objekt. Men noen ganger vil vi kanskje bare hente en del av dataene, helst i en flat struktur.

I denne raske opplæringen, vi får se hvordan vi kan oppnå dette i dvalemodus ved hjelp av en tilpasset klasse.

2. Enhetene

La oss først se på enheter vi skal bruke til å hente dataene:

@Entity offentlig klasse DeptEmployee {@Id @GeneratedValue (strategi = GenerationType.SEQUENCE) privat lang id; privat String ansattNummer; privat streng betegnelse; privat strengnavn; @ManyToOne privat avdeling; // constructor, getters and setters} @Entity public class Department {@Id @GeneratedValue (strategi = GenerationType.SEQUENCE) privat lang id; privat strengnavn; @OneToMany (mappedBy = "avdeling") private List-ansatte; offentlig avdeling (strengnavn) {this.name = navn; } // getters og setters}

Her har vi to enheter - Avdeling Ansatt og Avdeling. For enkelhets skyld, la oss anta at a Avdeling Ansatt kan tilhøre bare en Avdeling.

Men, en Avdeling kan ha flere Avdeling Ansatte.

3. En tilpasset spørresultatklasse

La oss si at vi vil skrive ut en liste over alle ansatte med bare navnet deres og navnet på avdelingen.

Vanligvis vil vi hente disse dataene med et spørsmål som dette:

Query query = session.createQuery ("fra com.baeldung.hibernate.entities.DeptEmployee"); Liste deptEmployees = query.list ();

Dette vil hente alle ansatte, alle deres eiendommer, tilhørende avdeling og alle dens eiendommer.

Men i dette spesielle tilfellet, dette kan være litt dyrt, ettersom vi bare trenger navnet på den ansatte og navnet på avdelingen.

En måte å bare hente informasjonen vi trenger er ved å spesifisere egenskapene i select-setningen.

Men når vi gjør dette, returnerer dvalemodus en liste over matriser i stedet for en liste over Objekter:

Query query = session.createQuery ("velg m.navn, m.department.name fra com.baeldung.hibernate.entities.DeptEmployee m"); Listechefer = query.list (); Objekt [] manager = (Object []) managers.get (0); assertEquals ("John Smith", manager [0]); assertEquals ("Salg", manager [1]);

Som vi kan se, er de returnerte dataene litt tungvint å behandle. Men heldigvis kan vi få dvalemodus til å fylle ut disse dataene i en klasse.

La oss se på Resultat klasse som vi bruker til å fylle ut hentede data i:

offentlig klasse Resultat {privat String ansattnavn; private strengavdeling navn; offentlig resultat (streng ansattnavn, strengavdelingsnavn) {dette.medarbeidernavn = ansattnavn; dette. avdelingsnavn = avdelingsnavn; } offentlig resultat () {} // getters and setters}

Merk at klassen ikke er en enhet, men bare en POJO. Vi kan imidlertid også bruke en enhet så lenge den har en konstruktør som tar alle attributter som vi vil fylle ut som parametere.

Vi får se hvorfor konstruktøren er viktig i neste avsnitt.

4. Bruke en konstruktør i HQL

La oss nå se på HQL som bruker denne klassen:

Query query = session.createQuery ("velg ny com.baeldung.hibernate.pojo.Result (m.name, m.department.name)" + "fra com.baeldung.hibernate.entities.DeptEmployee m"); Listeresultater = query.list (); Resultatresultat = results.get (0); assertEquals ("John Smith", result.getEmployeeName ()); assertEquals ("Salg", result.getDepartmentName ());

Her bruker vi konstruktøren vi definerte i Resultat klasse sammen med egenskapene vi vil hente. Dette vil returnere en liste over Resultat objekter med dataene fylt fra kolonnene.

Som vi kan se, er den returnerte listen lettere å behandle enn å bruke en liste over objektarrayer.

Det er viktig å merke seg at vi må bruke det fullstendige navnet på klassen i spørringen.

5. Bruke en ResultTransformer

Et alternativ til å bruke en konstruktør i HQL-spørringen er å bruke a ResultatTransformator:

Query query = session.createQuery ("velg m.navn som ansattnavn, m. Avdeling.navn som avdelingsnavn" + "fra com.baeldung.hibernate.entities.DeptEmployee m"); query.setResultTransformer (Transformers.aliasToBean (Resultat.klasse)); Listeresultater = query.list (); Resultatresultat = results.get (0); assertEquals ("John Smith", result.getEmployeeName ()); assertEquals ("Salg", result.getDepartmentName ());

Vi bruker Transformatorer.aliasToBean () metoden for å bruke de hentede dataene til å fylle ut Resultat gjenstander.

Derfor må vi sørge for at kolonnenavnene eller aliasene deres i seleksjonsuttalelsen samsvarer med egenskapene til Resultat klasse.

Noter det Query.setResultTransformer (ResultatTransformator) er utfaset siden dvalemodus 5.2.

6. Konklusjon

I denne artikkelen så vi hvordan en tilpasset klasse kan brukes til å hente data i et skjema som er lett å lese.

Kildekoden som følger med denne artikkelen, er tilgjengelig på GitHub.


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