Kortlægning af en dvale-forespørgsel til en brugerdefineret klasse

1. Oversigt

Når vi bruger dvale til at hente data fra databasen, bruger den som standard de hentede data til at konstruere hele objektgrafen til det ønskede objekt. Men nogle gange vil vi måske kun hente en del af dataene, helst i en flad struktur.

I denne hurtige vejledning vi får se, hvordan vi kan opnå dette i dvale ved hjælp af en brugerdefineret klasse.

2. Enhederne

Lad os først se på enheder, vi vil bruge til at hente dataene:

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

Her har vi to enheder - Afdeling Medarbejder og Afdeling. For nemheds skyld antager vi, at en Afdeling Medarbejder kan kun tilhøre en Afdeling.

Men, en Afdeling kan have flere Afdeling Medarbejdere.

3. En tilpasset forespørgselsresultatklasse

Lad os sige, at vi vil udskrive en liste over alle medarbejdere med bare deres navn og navnet på deres afdeling.

Typisk vil vi hente disse data med en forespørgsel som denne:

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

Dette vil hente alle medarbejdere, alle deres ejendomme, den tilknyttede afdeling og alle dens ejendomme.

Men i dette særlige tilfælde dette kan være lidt dyrt, da vi kun har brug for navnet på medarbejderen og navnet på afdelingen.

En måde at kun hente de oplysninger, vi har brug for, er ved at specificere egenskaberne i selektionssætningen.

Men når vi gør dette, returnerer dvale en liste over arrays i stedet for en liste over Objekter:

Forespørgsel = session.createQuery ("vælg 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 returnerede data lidt besværlige at behandle. Men heldigvis kan vi få dvale til at udfylde disse data i en klasse.

Lad os se på Resultat klasse, som vi bruger til at udfylde de hentede data i:

offentlig klasse Resultat {privat String medarbejdernavn; private strengafdelingsnavn; offentligt resultat (String medarbejdernavn, String afdelingsnavn) {dette.medarbejdernavn = medarbejdernavn; this.departmentName = departmentName; } offentligt resultat () {} // getters and setters}

Bemærk, at klassen ikke er en enhed, men kun en POJO. Vi kan dog også bruge en enhed, så længe den har en konstruktør, der tager alle attributter, som vi vil udfylde, som parametre.

Vi ser, hvorfor konstruktøren er vigtig i det næste afsnit.

4. Brug af en konstruktør i HQL

Lad os nu se på HQL, der bruger denne klasse:

Forespørgsel = session.createQuery ("vælg ny com.baeldung.hibernate.pojo.Result (m.name, m.department.name)" + "fra com.baeldung.hibernate.entities.DeptEmployee m"); Listeresultater = forespørgsel.liste (); Resultat resultat = results.get (0); assertEquals ("John Smith", result.getEmployeeName ()); assertEquals ("Salg", result.getDepartmentName ());

Her bruger vi den konstruktør, vi definerede i Resultat klasse sammen med de egenskaber, vi vil hente. Dette vil returnere en liste over Resultat objekter med data udfyldt fra kolonnerne.

Som vi kan se, er den returnerede liste lettere at behandle end at bruge en liste over objektarrays.

Det er vigtigt at bemærke, at vi er nødt til at bruge det fuldt kvalificerede navn på klassen i forespørgslen.

5. Brug af en ResultTransformer

Et alternativ til at bruge en konstruktør i HQL-forespørgslen er at bruge en ResultatTransformer:

Forespørgsel = session.createQuery ("vælg m.navn som medarbejdernavn, m.department.navn som afdelingsnavn" + "fra com.baeldung.hibernate.entities.DeptEmployee m"); query.setResultTransformer (Transformers.aliasToBean (Resultat.klasse)); Listeresultater = forespørgsel.liste (); Resultat resultat = results.get (0); assertEquals ("John Smith", result.getEmployeeName ()); assertEquals ("Salg", result.getDepartmentName ());

Vi bruger Transformere.aliasToBean () metode til at bruge de hentede data til at udfylde Resultat genstande.

Derfor er vi nødt til at sikre, at kolonnenavnene eller deres aliaser i selektsætningen matcher egenskaberne for Resultat klasse.

Noter det Query.setResultTransformer (ResultatTransformer) er udfaset siden dvaletilstand 5.2.

6. Konklusion

I denne artikel så vi, hvordan en brugerdefineret klasse kan bruges til at hente data i en form, der er let at læse.

Kildekoden, der ledsager denne artikel, er tilgængelig på GitHub.


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