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.


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