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.