Hibernált lekérdezés hozzárendelése egyéni osztályhoz
1. Áttekintés
Amikor a Hibernate-et használjuk adatok lekéréséhez az adatbázisból, alapértelmezés szerint a lekért adatok felhasználásával elkészíti a kért objektum teljes objektumgrafikáját. De néha előfordulhat, hogy csak az adatok egy részét szeretnénk lekérni, lehetőleg lapos szerkezetben.
Ebben a gyors bemutatóban meglátjuk, hogyan érhetjük el ezt hibernált állapotban egy egyedi osztály használatával.
2. Az entitások
Először nézzük meg azokat az entitásokat, amelyeket az adatok lekéréséhez használunk:
@Entity public class DeptEmployee {@Id @GeneratedValue (strategy = GenerationType.SEQUENCE) private long id; privát String alkalmazottszám; privát húr megjelölés; privát karakterlánc neve; @ManyToOne magánosztály osztály; // konstruktor, getterek és beállítók} @Entity public class Department {@Id @GeneratedValue (strategy = GenerationType.SEQUENCE) private long id; privát karakterlánc neve; @OneToMany (mappedBy = "osztály") magánlista alkalmazottai; public Department (String name) {ez.név = név; } // szerelők és beállítók}
Itt két entitásunk van - DeptEmployee és Osztály. Tegyük fel, hogy az egyszerűség kedvéért a DeptEmployee csak egyhez tartozhat Osztály.
De, a Osztály lehet több DeptEmployees.
3. Egyéni lekérdezés eredménye osztály
Tegyük fel, hogy ki akarunk nyomtatni egy listát az összes alkalmazottról, csak a nevükkel és az osztályuk nevével.
Ezeket az adatokat általában egy ilyen lekérdezéssel kapnánk le:
Lekérdezés = session.createQuery ("from com.baeldung.hibernate.entities.DeptEmployee"); List deptEmployees = lekérdezés.lista ();
Ez lekéri az összes alkalmazottat, minden tulajdonságukat, a hozzá tartozó részleget és annak összes tulajdonságát.
De ebben a konkrét esetben ez kissé drága lehet, mivel csak az alkalmazott nevére és az osztály nevére van szükségünk.
Csak a szükséges információk megszerzésének egyik módja a tulajdonságok megadása a select záradékban.
De amikor ezt megtesszük, a Hibernate tömbök listáját adja vissza a listák helyett Tárgyak:
Lekérdezés = session.createQuery ("válassza ki az m.nevet, az m.részleg nevét a com.baeldung.hibernate.entities.DeptEmployee m" közül; Lista menedzserek = lekérdezés.lista (); Object [] manager = (Object []) manager.get (0); assertEquals ("John Smith", menedzser [0]); assertEquals ("Értékesítés", menedzser [1]);
Mint láthatjuk, a visszaküldött adatok feldolgozása kissé nehézkes. De szerencsére elérhetjük a Hibernate-t, hogy ezeket az adatokat osztályokba töltse fel.
Nézzük meg a Eredmény osztály, amelyet a lekért adatok feltöltésére használunk:
public class Eredmény {private String alkalmazottNév; privát húr részlegNév; nyilvános Eredmény (String alkalmazottNév, String részlegNév) {this.employeeName = alkalmazottNév; this.departmentName = osztályNév; } public Result () {} // getterek és beállítók}
Vegye figyelembe, hogy az osztály nem entitás, hanem csak POJO. Használhatunk azonban egy entitást is, amennyiben van egy konstruktora, amely paraméterként veszi fel az összes attribútumot, amelyet fel akarunk tölteni.
A következő részben megtudjuk, miért fontos a kivitelező.
4. Konstruktor használata HQL-ben
Most nézzük meg az HQL-t, amely ezt az osztályt használja:
Lekérdezés = session.createQuery ("válasszon új com.baeldung.hibernate.pojo.Result (m.név, m.department.name)" + "from com.baeldung.hibernate.entities.DeptEmployee m"); Lista eredmények = lekérdezés.lista (); Eredmény eredménye = results.get (0); assertEquals ("John Smith", eredmény.getEmployeeName ()); assertEquals ("Értékesítés", eredmény.getDepartmentName ());
Itt azt a konstruktort használjuk, amelyet a Eredmény osztály a megszerezni kívánt tulajdonságokkal együtt. Ez visszaadja a Eredmény objektumok az oszlopokból feltöltött adatokkal.
Mint láthatjuk, a visszaküldött listát könnyebb feldolgozni, mint az objektumtömbök listáját használni.
Fontos megjegyezni, hogy a lekérdezésben az osztály teljesen minősített nevét kell használnunk.
5. ResultTransformer használata
A HQL lekérdezésben a konstruktor használatának alternatívája az a használata Transformer:
Lekérdezés = session.createQuery ("válassza az m.nevet alkalmazottnévként, m.department.name osztálynévként" + "a com.baeldung.hibernate.entities.DeptEmployee m címről); query.setResultTransformer (Transformers.aliasToBean (Result.class)); Lista eredmények = lekérdezés.lista (); Eredmény eredménye = results.get (0); assertEquals ("John Smith", eredmény.getEmployeeName ()); assertEquals ("Értékesítés", result.getDepartmentName ());
Használjuk a Transzformátorok.aliasToBean () módszer a lekért adatok felhasználására a Eredmény tárgyakat.
Következésképpen meg kell győződnünk arról, hogy a select utasítás oszlopnevei vagy álnevei megegyeznek-e a tulajdonságokkal Eredmény osztály.
Vegye figyelembe, hogy Query.setResultTransformer (ResultTransformer) a hibernálás 5.2 óta elavult.
6. Következtetés
Ebben a cikkben azt láttuk, hogy egy egyéni osztály hogyan használható az adatok könnyen olvasható formában történő lekérésére.
A cikkhez tartozó forráskód elérhető a GitHubon.