Tárolt eljárások hibernált állapotban
1. Áttekintés
A Tárolt eljárások összeállított SQL utasítások halmaza az adatbázisban található. Ezeket arra használják, hogy más programokkal kapszulázzák és osszák meg a logikát, és kihasználják az adatbázis-specifikus szolgáltatásokat, például az indexes tippeket vagy a konkrét kulcsszavakat.
Ez a cikk bemutatja, hogyan kell használni Hibernálás felhívni a tárolt eljárás a MySQL adatbázis.
2. Tárolt eljárások a MySQL-ben
Mielőtt megvitatnánk, hogyan hívhatunk tárolt eljárást hibernált állapotból, létre kell hoznunk.
Ehhez a gyors MySQL példához létrehozunk egy tárolt eljárást, amellyel az összes rekordot a foo asztal.
Tárolt eljárás létrehozásához felhasználjuk a ELJÁRÁS LÉTREHOZÁSA nyilatkozat:
ELhatároló // ELJÁRÁS LÉTREHOZÁSA GetAllFoos () NYELV SQL MEGHATÁROZÓ SQL BIZTONSÁGI MEGHATÁROZÓ KEZDÉS KEZDŐ * FROM foo; VÉGE // ELhatároló;
Előtte KEZDŐDIK utasítás, definiálhatunk opcionális utasításokat. A hivatalos MySQL dokumentációs linket követve részletesen áttekintheti ezeket az utasításokat.
Használhatjuk a HÍVÁS nyilatkozatot, hogy megbizonyosodjon arról, hogy eljárásunk a kívánt módon viselkedik:
FELHÍVÁS GetAllFoos ();
Most, hogy elindult a tárolt eljárásunk, folytassuk egyenesen azzal, hogy miként hívhatjuk hibernált állapotból.
3. Hívjon tárolt eljárást hibernált állapotban
A Hibernate 3-tól kezdve lehetőségünk van a nyers SQL utasítás használatára, beleértve a tárolt eljárásokat is az adatbázis lekérdezéséhez.
Ebben a szakaszban egy látszólag alapvető példát fogunk végigvezetni, amely szemlélteti, hogyan hívható a GetAllFoos () hibernált állapotban.
3.1. Konfiguráció
Mielőtt elkezdenénk futtatható kódot írni, be kell állítanunk a hibernálást a projektünkben.
És természetesen minderre - a Maven-függőségekre, a MySQL-konfigurációra, a hibernált konfigurációra és a SessionFactory példányosítás - megnézheti a Hibernate cikket.
3.2. Tárolt eljárás hívása a CreateNativeSQL Módszer
A hibernálás lehetővé teszi a lekérdezések kifejezését natív SQL formázza közvetlenül. Ezért egyszerűen létrehozhatunk natív SQL lekérdezést, és használhatjuk a HÍVÁS nyilatkozatot a getAllFoos () tárolt eljárás:
Lekérdezés = session.createSQLQuery ("CALL GetAllFoos ()"). AddEntity (Foo.class); List allFoos = query.list ();
A fenti lekérdezés egy olyan listát ad vissza, ahol minden elem a Foo otárgy.
Használjuk a addEntity () módszer az entitásobjektumok megszerzésére a natívból SQL lekérdezés, különben a ClassCastException akkor kerül dobásra, ha egy tárolt eljárás nem nyers értéket ad vissza.
3.3. Tárolt eljárás hívása a @NévNativeQueries
A tárolt eljárás meghívásának másik módja a @NévNativeQueries annotáció.
@NévNativeQueries a natív tömb megadására szolgál SQL megnevezett lekérdezések a perzisztencia egységre terjedt ki:
@NamedNativeQueries ({@NamedNativeQuery (name = "callGetAllFoos", query = "CALL GetAllFoos ()", resultClass = Foo.class)}) @Entity nyilvános osztály Foo megvalósítja a Serializable {// Modelldefiníció}
Minden megnevezett lekérdezésnek nyilvánvalóan van egy név attribútum, a tényleges SQL lekérdezés, és a resultClassamely a Foo leképezett entitás.
Lekérdezés = session.getNamedQuery ("callGetAllFoos"); List allFoos = query.list ();
A resultClassattribútum ugyanazt a szerepet tölti be, mint a addEntity () módszer az előző példánkban.
Mindkét megközelítés felcserélhető módon alkalmazható, mivel a teljesítmény vagy a termelékenység tekintetében nincsenek valós különbségek a kettő között.
3.4. Tárolt eljárás hívása a @NamedStoredProcedureQuery
Ha használja JPA 2.1 és a Hibernálás a EntityManagerFactoryés EntityManager.
A @NamedStoredProcedureQuery annotációval tárolt eljárás deklarálható:
@NamedStoredProcedureQuery (name = "GetAllFoos", procedureName = "GetAllFoos", resultClasses = {Foo.class}) @Entity public class Foo implementálja a Serializable {// Model Definition}
A megnevezett tárolt eljárás lekérdezésének meghívásához be kell állítanunk egy EntityManager, majd hívja a createNamedStoredProcedureQuery () módszer az eljárás létrehozásához:
StoredProcedureQuery spQuery = entitásManager.createNamedStoredProcedureQuery ("getAllFoos");
Közvetlenül megkaphatjuk a listát Fooszervezetek hívásával végrehajtani () módszer be StoredProcedureQuerytárgy.
4. Tárolt eljárások paraméterekkel
Szinte minden tárolt eljárásunk megköveteli a paramétereket. Ebben a részben bemutatjuk, hogyan hívhatunk meg tárolt eljárást paraméterekkel Hibernálás.
Hozzunk létre egy getFoosByName () tárolt eljárás MySQL.
Ez az eljárás visszaadja a Foo objektumok, ahol a név attribútum megegyezik a fooName paraméter:
KIVÁLASZTÓ // ELJÁRÁS LÉTREHOZÁSA GetFoosByName (IN fooName VARCHAR (255)) NYELV SQL MEGHATÁROZÓ SQL BIZTONSÁGI MEGHATÁROZÓ KEZDEMÉNYEZÉS KEZDEMÉNYEZÉS * FROM foo WHERE név = fooName; VÉGE // ELhatároló;
Hívni a GetFoosByName ()eljárás megnevezett paramétereket fogunk használni:
Lekérdezés = session.createSQLQuery ("CALL GetFoosByName (: fooName)") .addEntity (Foo.class) .setParameter ("fooName", "New Foo");
Hasonlóképpen, a megnevezett paraméter : fooName használható a @NévNativeQuery kommentár:
@NévNativeQuery (név = "callGetFoosByName", lekérdezés = "HÍVÁS GetFoosByName (: fooName)", resultClass = Foo.class)
A megnevezett lekérdezést a következőképpen hívják meg:
Lekérdezés = session.getNamedQuery ("callGetFoosByName") .setParameter ("fooName", "New Foo");
A @NamedStoredProcedureQuery annotációval, paramétereket adhatunk meg a @StoredProcedureParameter annotáció:
@NamedStoredProcedureQuery (name = "GetFoosByName", procedureName = "GetFoosByName", resultClasses = {Foo.class}, paraméterek = {@StoredProcedureParameter (name = "fooName", type = String.class, mode = ParameterMode.IN)}
Használhatjuk a registerStoredProcedureParameter () módszer a tárolt eljárásunk meghívására a fooName paraméter:
StoredProcedureQuery spQuery = entitásManager. createNamedStoredProcedureQuery ("GetFoosByName") .registerStoredProcedureParameter ("New Foo", String.class, ParameterMode.IN);
5. Következtetés
Ez a cikk bebizonyította a Hibernate használatával tárolt eljárást hívhat meg a MySQL adatbázisban különböző megközelítéseket alkalmazva.
Érdemes ezt megemlíteni nem minden RDBMS támogatja a tárolt eljárásokat.
A cikkben található példákat a csatolt GitHub projektben tekintheti meg.