Mapovanie hibernačného dopytu na vlastnú triedu

1. Prehľad

Keď na načítanie údajov z databázy použijeme režim dlhodobého spánku, štandardne použije získané údaje na zostavenie celého grafu objektu pre požadovaný objekt. Niekedy však možno budeme chcieť získať iba časť údajov, najlepšie v plochej štruktúre.

V tomto rýchlom návode uvidíme, ako to dosiahneme v režime dlhodobého spánku pomocou vlastnej triedy.

2. Subjekty

Najprv sa pozrime na entity, ktoré použijeme na načítanie údajov:

@Entity public class DeptEmployee {@Id @GeneratedValue (strategy = GenerationType.SEQUENCE) súkromné ​​dlhé ID; private String employeeNumber; súkromné ​​označenie reťazca; súkromné ​​meno reťazca; @ManyToOne oddelenie súkromného oddelenia; // constructor, getters and setters} @Entity public class Department {@Id @GeneratedValue (strategy = GenerationType.SEQUENCE) private long id; súkromné ​​meno reťazca; @OneToMany (mappedBy = "department") zamestnanci súkromného zoznamu; verejné oddelenie (názov reťazca) {this.name = meno; } // zakladatelia a zakladatelia}

Tu máme dve entity - Zamestnanec a Oddelenie. Pre jednoduchosť predpokladajme, že a Zamestnanec môže patriť iba jednému Oddelenie.

Ale, a Oddelenie môže mať viac Zamestnanci.

3. Trieda výsledku vlastného dopytu

Povedzme, že chceme vytlačiť zoznam všetkých zamestnancov iba s ich menom a menom ich oddelenia.

Zvyčajne by sme tieto údaje načítali pomocou dotazu, ako je tento:

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

Týmto sa načítajú všetci zamestnanci, všetky ich vlastnosti, pridružené oddelenie a všetky jeho vlastnosti.

Ale v tomto konkrétnom prípade to by mohlo byť trochu drahé, pretože potrebujeme iba meno zamestnanca a názov oddelenia.

Jedným zo spôsobov, ako získať iba informácie, ktoré potrebujeme, je špecifikácia vlastností v klauzule select.

Ale keď to urobíme, Hibernate vráti zoznam polí namiesto zoznamu Predmety:

Dotaz na dotaz = session.createQuery ("vyberte m.name, m.department.name z com.baeldung.hibernate.entities.DeptEmployee m"); Zoznam manažérov = query.list (); Object [] manager = (Object []) manažéri.get (0); assertEquals ("John Smith", manažér [0]); assertEquals ("Predaj", manažér [1]);

Ako vidíme, vrátené údaje sú trochu ťažkopádne na spracovanie. Ale, našťastie, môžeme získať režim dlhodobého spánku na vyplnenie týchto údajov do triedy.

Pozrime sa na Výsledok trieda, ktorú použijeme na vyplnenie získaných údajov do:

verejná trieda Výsledok {private String employeeName; private String departmentName; public Result (String employeeName, String departmentName) {this.employeeName = employeeName; this.departmentName = departmentName; } public Result () {} // zakladatelia a nastavovatelia}

Upozorňujeme, že trieda nie je entita, ale iba POJO. Môžeme však použiť aj entitu, pokiaľ má konštruktor, ktorý berie všetky parametre, ktoré chceme vyplniť, ako parametre.

Uvidíme, prečo je konštruktér dôležitý v ďalšej časti.

4. Používanie konštruktora v HQL

Teraz sa pozrime na HQL, ktoré používa túto triedu:

Dotazový dotaz = session.createQuery ("vyberte nový com.baeldung.hibernate.pojo.Result (m.name, m.department.name)" + "z com.baeldung.hibernate.entities.DeptEmployee m"); Zoznam výsledkov = query.list (); Výsledok výsledok = results.get (0); assertEquals ("John Smith", result.getEmployeeName ()); assertEquals ("Predaj", result.getDepartmentName ());

Tu použijeme konštruktor, ktorý sme definovali v Výsledok triedy spolu s vlastnosťami, ktoré chceme získať. Týmto sa vráti zoznam Výsledok objekty s údajmi vyplnenými zo stĺpcov.

Ako vidíme, vrátený zoznam je ľahšie spracovateľný ako použitie zoznamu polí objektov.

Je dôležité si uvedomiť, že v dotaze musíme použiť úplný názov triedy.

5. Používanie ResultTransformer

Alternatívou k použitiu konštruktora v dotaze HQL je použitie a ResultTransformer:

Dotaz query = session.createQuery ("vyberte m.name ako employeeName, m.department.name ako departmentName" + "z com.baeldung.hibernate.entities.DeptEmployee m"); query.setResultTransformer (Transformers.aliasToBean (Result.class)); Zoznam výsledkov = query.list (); Výsledok výsledok = results.get (0); assertEquals ("John Smith", result.getEmployeeName ()); assertEquals ("Predaj", result.getDepartmentName ());

Používame Transformátory.aliasToBean () metóda na použitie získaných údajov na vyplnenie súboru Výsledok predmety.

Následne sa musíme ubezpečiť, že názvy stĺpcov alebo ich aliasy v príkaze select zodpovedajú vlastnostiam Výsledok trieda.

Poznač si to Query.setResultTransformer (ResultTransformer) je zastaraná od režimu dlhodobého spánku 5.2.

6. Záver

V tomto článku sme videli, ako je možné použiť vlastnú triedu na načítanie údajov vo forme, ktorá je ľahko čitateľná.

Zdrojový kód, ktorý je priložený k tomuto článku, je k dispozícii na serveri GitHub.


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