Mapiranje hibernacijskog upita u prilagođenu klasu

1. Pregled

Kada koristimo Hibernate za dohvaćanje podataka iz baze podataka, prema zadanim postavkama koristi preuzete podatke za izradu cijelog grafa objekta za traženi objekt. Ali ponekad bismo mogli htjeti dohvatiti samo dio podataka, po mogućnosti u ravnoj strukturi.

U ovom brzom vodiču, vidjet ćemo kako to možemo postići u hibernaciji koristeći prilagođenu klasu.

2. Entiteti

Prvo, pogledajmo entitete koje ćemo koristiti za dohvaćanje podataka:

@Entity javna klasa DeptE Employee {@Id @GeneratedValue (strategy = GenerationType.SEQUENCE) private long id; private String workerNumber; oznaka privatnog niza; privatni naziv niza; @ManyToOne privatni odjel odjela; // konstruktor, getteri i postavljači} @Entity odjel javne klase {@Id @GeneratedValue (strategija = GenerationType.SEQUENCE) private long id; privatni naziv niza; @OneToMany (mappedBy = "odjel") privatni popis zaposlenika; javni odjel (naziv niza) {this.name = name; } // geteri i postavljači}

Ovdje imamo dva entiteta - Zaposlenik odjela i Odjel. Radi jednostavnosti, pretpostavimo da a Zaposlenik odjela može pripadati samo jednom Odjel.

Ali, a Odjel može imati više Zaposlenici odjela.

3. Klasa prilagođenih rezultata upita

Recimo da želimo ispisati popis svih zaposlenika sa samo njihovim imenom i nazivom njihovog odjela.

Ti bi podaci obično dolazili s ovakvim upitom:

Upit upita = session.createQuery ("iz com.baeldung.hibernate.entities.DeptEfficiee"); Popis deptEfficiees = query.list ();

Ovo će dohvatiti sve zaposlenike, sva njihova svojstva, pridruženi odjel i sva njegova svojstva.

Ali, u ovom konkretnom slučaju, ovo bi moglo biti malo skupo jer nam trebaju samo ime zaposlenika i naziv odjela.

Jedan od načina da samo dođemo do podataka koji su nam potrebni je navođenjem svojstava u klauzuli select.

Ali, kada to učinimo, Hibernate vraća popis nizova umjesto popisa Predmeti:

Upit upita = session.createQuery ("odaberite m.name, m.department.name iz com.baeldung.hibernate.entities.DeptE Employee m"); Voditelji popisa = query.list (); Object [] manager = (Object []) manager.get (0); assertEquals ("John Smith", upravitelj [0]); assertEquals ("Prodaja", voditelj [1]);

Kao što vidimo, vraćeni podaci pomalo su nezgodni za obradu. Ali, srećom, možemo postići Hibernate da ove podatke popunjava u klasu.

Pogledajmo Proizlaziti klase koju ćemo upotrijebiti za popunjavanje preuzetih podataka u:

rezultat javne klase {private String workerName; private String departmentName; javni rezultat (Niz zaposlenika, StringName odjeljenja) {this.employeeName = ime zaposlenika; this.departmentName = Ime odjela; } javni rezultat () {} // dobivači i postavljači}

Imajte na umu da klasa nije entitet već samo POJO. Međutim, entitet također možemo koristiti sve dok ima konstruktor koji uzima sve parametre koje želimo popuniti kao parametre.

Zašto je konstruktor važan vidjet ćemo u sljedećem odjeljku.

4. Korištenje konstruktora u HQL-u

Sada, pogledajmo HQL koji koristi ovu klasu:

Upit upita = session.createQuery ("odaberite novi com.baeldung.hibernate.pojo.Result (m.name, m.department.name)" + "iz com.baeldung.hibernate.entities.DeptE Employee m"); Popis rezultata = query.list (); Rezultat rezultata = results.get (0); assertEquals ("John Smith", result.getEfficieeName ()); assertEquals ("Prodaja", result.getDepartmentName ());

Ovdje koristimo konstruktor koji smo definirali u Proizlaziti klasa zajedno sa svojstvima koja želimo dohvatiti. Ovo će vratiti popis Proizlaziti objekti s podacima popunjenim iz stupaca.

Kao što vidimo, vraćeni popis lakše je obraditi nego koristiti popis nizova objekata.

Važno je napomenuti da u upitu moramo koristiti potpuno kvalificirano ime klase.

5. Korištenje ResultTransformera

Alternativa korištenju konstruktora u HQL upitu je uporaba a Transformator rezultata:

Upit upita = session.createQuery ("odaberite ime m. Kao Ime zaposlenika, ime m odjeljenja kao Ime odjela" + "iz com.baeldung.hibernate.entities.DeptE Employee m"); query.setResultTransformer (Transformers.aliasToBean (Rezultat.klasa)); Popis rezultata = query.list (); Rezultat rezultata = results.get (0); assertEquals ("John Smith", result.getEfficieeName ()); assertEquals ("Prodaja", result.getDepartmentName ());

Koristimo Transformatori.aliasToBean () metoda za korištenje preuzetih podataka za popunjavanje Proizlaziti predmeta.

Slijedom toga, moramo osigurati da se nazivi stupaca ili njihovi aliasi u naredbi select podudaraju sa svojstvima Proizlaziti razred.

Imajte na umu da Query.setResultTransformer (ResultTransformer) je zastarjelo od hibernacije 5.2.

6. Zaključak

U ovom smo članku vidjeli kako se prilagođena klasa može koristiti za dohvaćanje podataka u obliku koji se lako čita.

Izvorni kod koji prati ovaj članak dostupan je na GitHubu.


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