Hibernált névvel ellátott lekérdezés

1. Áttekintés

Nagy hátránya annak, hogy a HQL és az SQL szétszórt az adatelérési objektumok között, hogy olvashatatlanná teszi a kódot. Ezért célszerű lehet az összes HQL-t és SQL-t egy helyre csoportosítani, és csak a hivatkozásukat használni a tényleges adatelérési kódban. Szerencsére a hibernálás lehetővé teszi számunkra, hogy ezt megnevezett lekérdezésekkel tegyük meg.

A megnevezett lekérdezés statikusan definiált lekérdezés, előre definiált, megváltoztathatatlan lekérdezési karakterlánccal. A munkamenet-gyár létrehozásakor érvényesülnek, így az alkalmazás hiba esetén gyorsan meghiúsul.

Ebben a cikkben megtudjuk, hogyan definiálhatjuk és hogyan használhatjuk a hibernált elnevezett lekérdezéseket a @NévQuery és @NévNativeQuery annotációk.

2. Az entitás

Először nézzük meg a cikkben használt entitást:

@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; // szerelők és beállítók}

Példánkban egy alkalmazottat keresünk be az alkalmazott száma alapján.

3. Elnevezett lekérdezés

Ha ezt megnevezett lekérdezésként szeretnénk meghatározni, akkor a org.hibernate.annotations.NamedQuery annotáció. Kiterjeszti a javaxot.kitartás.NévQuery hibernált funkciókkal.

Meghatározzuk a DeptEmployee osztály:

@ org.hibernate.annotations.NamedQuery (név = "DeptEmployee_findByEmployeeNumber", lekérdezés = "DeptEmployee-tól, ahol workerNumber =: alkalmazottNem") 

Fontos megjegyezni, hogy minden @NévQuery az annotáció pontosan egy entitásosztályhoz vagy leképezett szuperosztályhoz van csatolva. De,mivel a megnevezett lekérdezések köre a teljes perzisztencia egység, az ütközés elkerülése érdekében gondosan kell megválasztanunk a lekérdezés nevét. Ezt úgy értük el, hogy az entitás nevét előtagként használjuk.

Ha egy entitáshoz több elnevezett lekérdezésünk van, akkor a @NévQueries kommentár ezek csoportosításához:

@ org.hibernate.annotations.NamedQueries ({@ org.hibernate.annotations.NamedQuery (name = "DeptEmployee_FindByEmployeeNumber", query = "from DeptEmployee where workerNumber =: workerNo"), @ org.hibernate.annotations.NamedQuery (name DeptEmployee_FindAllByDesgination ", query =" from DeptEmployee where designation =: designation "), @ org.hibernate.annotations.NamedQuery (name =" DeptEmployee_UpdateEmployeeDepartment ", query =" Frissítse DeptEmployee beállított munkatársat: "newDepartment" ..})

Vegye figyelembe, hogy a HQL lekérdezés lehet DML stílusú művelet. Tehát nem kell a válassza csak nyilatkozat. Például rendelkezhetünk frissítési lekérdezéssel, mint a DeptEmployee_UpdateEmployeeDesignation felett.

3.1. A lekérdezési szolgáltatások konfigurálása

Különböző lekérdezési funkciókat állíthatunk be a @NévQuery annotáció. Nézzünk meg egy példát:

@ org.hibernate.annotations.NamedQuery (név = "DeptEmployee_FindAllByDepartment", lekérdezés = "DeptEmployee-tól, ahol osztály =: osztály", timeout = 1, fetchSize = 10)

Itt konfiguráltuk az időtúllépés intervallumát és a lekérés méretét. E kettő mellett olyan funkciókat is beállíthatunk, mint például:

  • gyorsítótárazott - hogy a lekérdezés (eredmények) gyorsítótárazható-e vagy sem
  • cacheMode - a lekérdezéshez használt gyorsítótár mód; ez lehet az egyik GET, IGNORE, NORMAL, PUT, vagy FRISSÍTÉS
  • cacheRegion - ha a lekérdezés eredményei gyorsítótárban tárolhatók, nevezze meg a használni kívánt lekérdezés gyorsítótár régióját
  • megjegyzés - a létrehozott SQL lekérdezéshez hozzáadott megjegyzés; Célzott a DBA-k számára
  • flushMode - a lekérdezés flush módja, az egyik MINDIG, AUTO, COMMIT, MANUAL, vagy PERSISTENCE_CONTEXT

3.2. A Named Query használata

Most, hogy meghatároztuk a megnevezett lekérdezést, használjuk az alkalmazott beolvasására:

Lekérdezés = session.createNamedQuery ("DeptEmployee_FindByEmployeeNumber", DeptEmployee.class); query.setParameter ("alkalmazottNo", "001"); DeptEmployee eredmény = query.getSingleResult (); 

Itt használtuk a createNamedQuery módszer. Felveszi a lekérdezés nevét és egy org.hibernate.query.Query tárgy.

4. Nevezett bennszülött lekérdezés

A HQL lekérdezések mellett definiálhatjuk a natív SQL nevet is. Ehhez használhatjuk a @NévNativeQuery annotáció. Bár hasonló a @NévQuery, kicsit több konfigurációt igényel.

Fedezzük fel ezt a jegyzetet egy példával:

@ org.hibernate.annotations.NamedNativeQueries (@ org.hibernate.annotations.NamedNativeQuery (name = "DeptEmployee_GetEmployeeByName", query = "select * from deptemployee emp where name =: name", resultClass = DeptEmployee.class))

Mivel ez egy natív lekérdezés, meg kell mondanunk a Hibernate számára, hogy mely entitásosztályra kell feltérképezni az eredményeket. Következésképpen a resultClass ingatlant.

Az eredmények feltérképezésének másik módja a resultSetMapping ingatlan. Itt megadhatjuk egy előre definiált nevét SQLResultSetMapping.

Vegye figyelembe, hogy a következők közül csak egyet használhatunk resultClass és resultSetMapping.

4.1. A megnevezett natív lekérdezés használata

A megnevezett natív lekérdezés használatához használhatjuk a Session.createNamedQuery ():

Lekérdezés = session.createNamedQuery ("DeptEmployee_FindByEmployeeName", DeptEmployee.class); query.setParameter ("név", "John Wayne"); DeptEmployee eredmény = query.getSingleResult ();

Vagy a Session.getNamedNativeQuery ():

NativeQuery lekérdezés = session.getNamedNativeQuery ("DeptEmployee_FindByEmployeeName"); query.setParameter ("név", "John Wayne"); DeptEmployee eredmény = (DeptEmployee) lekérdezés.getSingleResult ();

Az egyetlen különbség e két megközelítés között a visszatérés típusa. A második megközelítés a NativeQuery, amely az alosztálya Lekérdezés.

5. Tárolt eljárások és funkciók

Használhatjuk a @NévNativeQuery annotáció a tárolt eljárásokhoz és funkciókhoz intézett hívások meghatározásához:

@ org.hibernate.annotations.NamedNativeQuery (név = "DeptEmployee_UpdateEmployeeDesignation", lekérdezés = "UPDATE_EMPLOYEE_DESIGNATION (: workerNumber,: newDesignation) hívása", resultClass = DeptEmployee.class)

Figyelje meg, hogy bár ez egy frissítési lekérdezés, mi ezt használtuk resultClass ingatlan. A hibernálás nem támogatja a tiszta natív skalár lekérdezéseket. És a probléma kiküszöbölésének módja az, ha vagy beállít egy resultClass vagy a resultSetMapping.

6. Következtetés

Ebben a cikkben láttuk, hogyan definiálhatjuk és használhatjuk a megnevezett HQL-t és a natív lekérdezéseket.

A forráskód elérhető a GitHubon.