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.