Uložené procedúry s režimom dlhodobého spánku
1. Prehľad
Uložené procedúry sú sady zostavených príkazov SQL v databáze. Používajú sa na zapuzdrenie a zdieľanie logiky s inými programami a využívajú výhody funkcií špecifických pre databázu, ako sú tipy na index alebo konkrétne kľúčové slová.
Tento článok ukazuje, ako sa používa Hibernácia zavolať a uložená procedúra v MySQL databáza.
2. Uložené procedúry v MySQL
Predtým, ako diskutujeme o tom, ako zavolať uloženú procedúru z režimu dlhodobého spánku, je potrebné ju vytvoriť.
Pre tento rýchly príklad MySQL vytvoríme uloženú procedúru, aby sme získali všetky záznamy z a foo stôl.
Na vytvorenie uloženej procedúry používame VYTVORIŤ POSTUP vyhlásenie:
DELIMITER // VYTVORENIE POSTUPU GetAllFoos () JAZYK SQL DETERMINISTICKÝ DEFINÉR BEZPEČNOSTI SQL ZAČIATOK VÝBERU * Z foo; KONIEC // ODDELOVAČ;
Pred ZAČAŤ príkaz, môžeme definovať voliteľné príkazy. Podrobnosti o týchto vyhláseniach môžete rozbaliť kliknutím na oficiálny odkaz na dokumentáciu MySQL.
Môžeme použiť VOLAJTE vyhlásenie, aby sme sa ubezpečili, že sa náš postup správa požadovaným spôsobom:
VOLAJTE GetAllFoos ();
Teraz, keď máme spustenú uloženú procedúru, prejdime priamo k tomu, ako ju nazvať z režimu dlhodobého spánku.
3. Zavolajte uloženú procedúru pomocou režimu dlhodobého spánku
Počnúc hibernáciou 3 máme možnosť použiť na dopytovanie databázy nespracovaný príkaz SQL vrátane uložených procedúr.
V tejto časti si ukážeme zdanlivo základný príklad, ktorý ilustruje, ako nazvať GetAllFoos () postup pomocou režimu dlhodobého spánku.
3.1. Konfigurácia
Predtým, ako začneme písať kód, ktorý je možné spustiť, musíme v našom projekte nakonfigurovať režim dlhodobého spánku.
A samozrejme k tomu všetkému - závislosti Maven, konfigurácia MySQL, konfigurácia režimu dlhodobého spánku a SessionFactory inštancia - môžete si pozrieť článok o režime dlhodobého spánku.
3.2. Zavolajte uloženú procedúru pomocou CreateNativeSQL Metóda
Hibernate umožňuje vyjadrovať dotazy v systéme Windows natívny SQL formátovať priamo. Preto môžeme priamo vytvoriť natívny dotaz SQL a použiť znak VOLAJTE vyhlásenie volať getAllFoos () uložená procedúra:
Dotaz na dotaz = session.createSQLQuery ("CALL GetAllFoos ()"). AddEntity (Foo.class); Zoznam allFoos = query.list ();
Vyššie uvedený dopyt vráti zoznam, v ktorom je každý prvok a Foo object.
Používame addEntity () metóda na získanie objektov entity z natívneho SQL dotaz, inak, a ClassCastException bude vyhodená vždy, keď uložená procedúra vráti nezpracovanú hodnotu.
3.3. Zavolajte uloženú procedúru pomocou @NamedNativeQueries
Ďalším spôsobom, ako zavolať uloženú procedúru, je použitie @NamedNativeQueries anotácia.
@NamedNativeQueries sa používa na zadanie poľa natívnych SQL pomenované dotazy zameraný na jednotku perzistencie:
@NamedNativeQueries ({@NamedNativeQuery (name = "callGetAllFoos", query = "CALL GetAllFoos ()", resultClass = Foo.class)}) @Entity public class Foo implementuje Serializable {// Definícia modelu}
Každý pomenovaný dopyt má zjavne a názov skutočný SQL dotaza resultClassktorý odkazuje na Foo mapovaná entita.
Dotaz na dotaz = session.getNamedQuery ("callGetAllFoos"); Zoznam allFoos = query.list ();
The resultClassatribút hrá rovnakú rolu ako addEntity () metóda v našom predchádzajúcom príklade.
Oba tieto prístupy sa dajú zameniť, pretože medzi nimi nie sú žiadne skutočné rozdiely, pokiaľ ide o výkon alebo produktivitu.
3.4. Zavolajte uloženú procedúru pomocou @NamedStoredProcedureQuery
Ak používate SPZ 2.1 a Hibernácia implementácia EntityManagerFactorya EntityManager.
The @NamedStoredProcedureQuery anotáciu možno použiť na vyhlásenie uloženej procedúry:
@NamedStoredProcedureQuery (name = "GetAllFoos", procedureName = "GetAllFoos", resultClasses = {Foo.class}) @Entity verejná trieda Foo implementuje Serializable {// definícia modelu}
Aby sme zavolali náš pomenovaný dotaz uloženej procedúry, musíme mať inštanciu EntityManager, a potom zavolajte createNamedStoredProcedureQuery () metóda na vytvorenie postupu:
StoredProcedureQuery spQuery = entityManager.createNamedStoredProcedureQuery ("getAllFoos");
Môžeme priamo získať zoznam Foosubjekty volaním na vykonať () metóda na StoredProcedureQueryobjekt.
4. Uložené procedúry s parametrami
Takmer všetky naše uložené procedúry budú vyžadovať parametre. V tejto časti si ukážeme, ako zavolať uloženú procedúru s parametrami z Hibernácia.
Vytvorme a getFoosByName () uložená procedúra v MySQL.
Tento postup vráti zoznam Foo objekty, kde sa atribút názvu zhoduje s fooName parameter:
DELIMITER // VYTVORIŤ POSTUP GetFoosByName (IN fooName VARCHAR (255)) JAZYK SQL DETERMINISTICKÝ DEFINÉR BEZPEČNOSTI SQL ZAČIATOK VÝBERU * FROM foo WHERE name = fooName; KONIEC // ODDELOVAČ;
Zavolať na GetFoosByName ()postup použijeme pomenované parametre:
Dotaz query = session.createSQLQuery ("CALL GetFoosByName (: fooName)") .addEntity (Foo.class) .setParameter ("fooName", "New Foo");
Podobne aj pomenovaný parameter : fooName možno použiť s @NamedNativeQuery anotácia:
@NamedNativeQuery (name = "callGetFoosByName", query = "VOLAŤ GetFoosByName (: fooName)", resultClass = Foo.class)
Pomenovaný dotaz by sa volal takto:
Dotaz na dotaz = session.getNamedQuery ("callGetFoosByName") .setParameter ("fooName", "New Foo");
Pri použití @NamedStoredProcedureQuery anotáciu, môžeme parametre špecifikovať pomocou @StoredProcedureParameter anotácia:
@NamedStoredProcedureQuery (name = "GetFoosByName", procedureName = "GetFoosByName", resultClasses = {Foo.class}, parameters = {@StoredProcedureParameter (name = "fooName", type = String.class, mode = ParameterMode.IN)})
Môžeme využiť registerStoredProcedureParameter () metóda zavolať našu uloženú procedúru s fooName parameter:
StoredProcedureQuery spQuery = entityManager. createNamedStoredProcedureQuery ("GetFoosByName") .regStoredProcedureParameter ("New Foo", String.class, ParameterMode.IN);
5. Záver
Tento článok demonštroval ako používať Hibernate na volanie uloženej procedúry v databáze MySQL pomocou rôznych prístupov.
Za zmienku stojí to nie všetky RDBMS podporujú uložené procedúry.
Príklady uvedené v tomto článku si môžete pozrieť v prepojenom projekte GitHub.