Pohranjeni postupci s hibernacijom

1. Pregled

Pohranjene procedure su skupovi prevedenih SQL izraza koji borave u bazi podataka. Koriste se za inkapsuliranje i dijeljenje logike s drugim programima, a imaju koristi od značajki specifičnih za bazu podataka, poput savjeta za indeks ili određenih ključnih riječi.

Ovaj članak pokazuje kako se koristi Hibernate nazvati a pohranjeni postupak u MySQL baza podataka.

2. Pohranjene procedure u MySQL-u

Prije nego što razgovaramo o tome kako nazvati pohranjenu proceduru iz hibernacije, moramo je stvoriti.

Za ovaj brzi MySQL primjer stvorit ćemo pohranjenu proceduru za dobivanje svih zapisa iz a foo stol.

Da bismo stvorili pohranjenu proceduru, koristimo IZRADI POSTUPAK izjava:

DELIMITER // STVORI POSTUPAK GetAllFoos () JEZIK SQL DETERMINISTIČKI DEFINER SIGURNOSTI SQL POČNI ODABRATI * IZ foo; KRAJ // DELIMITER;

Prije POČETI Izjava, možemo definirati neobavezne izjave Pojedinosti ovih izjava možete detaljno proučiti slijedeći službenu vezu s dokumentacijom MySQL.

Možemo koristiti POZIV izjava kako bismo bili sigurni da se naš postupak ponaša na željeni način:

POZOVITE GetAllFoos ();

Sad kad imamo pokrenutu pohranjenu proceduru, krenimo odmah kako je nazvati iz hibernacije.

3. Nazovite pohranjeni postupak s hibernacijom

Počevši od Hibernate 3, imamo mogućnost korištenja sirovog SQL izraza, uključujući pohranjene procedure, za postavljanje upita u bazu podataka.

U ovom ćemo odjeljku proći kroz naizgled osnovni primjer koji će ilustrirati kako nazvati GetAllFoos () postupak pomoću hibernacije.

3.1. Konfiguracija

Prije nego što započnemo s pisanjem koda koji se može pokrenuti, u našem projektu moramo konfigurirati Hibernate.

I naravno za sve to - Mavenove ovisnosti, MySQL konfiguracija, Hibernate konfiguracija i SjednicaTvornica instancija - možete pogledati članak Hibernate.

3.2. Nazovite pohranjenu proceduru koristeći CreateNativeSQL Metoda

Hibernate omogućuje izražavanje upita u izvorni SQL formatirati izravno. Stoga možemo izravno stvoriti izvorni SQL upit i koristiti POZIV izjava za poziv getAllFoos () pohranjeni postupak:

Upit upita = session.createSQLQuery ("CALL GetAllFoos ()"). AddEntity (Foo.class); Navedi allFoos = query.list (); 

Gornji upit vraća popis gdje je svaki element a Foo objekt.

Koristimo addEntity () metoda za dobivanje entitetnih objekata iz nativnog SQL upit, inače, a ClassCastException bacit će se kad god pohranjena procedura vrati ne-sirovu vrijednost.

3.3. Nazovite pohranjenu proceduru koristeći @NamedNativeQueries

Drugi način pozivanja pohranjene procedure je upotreba datoteke @NamedNativeQueries bilješka.

@NamedNativeQueries koristi se za specificiranje niza izvornih SQL imenovani upiti obuhvaćeno jedinicom postojanosti:

@NamedNativeQueries ({@NamedNativeQuery (name = "callGetAllFoos", query = "CALL GetAllFoos ()", resultClass = Foo.class)}) @Entity javna klasa Foo implementira serializiranje {// Definicija modela}

Svaki imenovani upit očito ima Ime atribut, stvarni SQL upit, i resultClasskoji se odnosi na Foo mapirani entitet.

Upit upita = session.getNamedQuery ("callGetAllFoos"); Navedi allFoos = query.list ();

The resultClassatribut igra istu ulogu kao i addEntity () metoda u našem prethodnom primjeru.

Oba ova pristupa mogu se koristiti naizmjenično, jer između njih nema stvarnih razlika kada su u pitanju performanse ili produktivnost.

3.4. Nazovite pohranjenu proceduru koristeći @NamedStoredProcedureQuery

Ako koristite JPA 2.1 i Hibernate provedba EntityManagerFactoryi EntityManager.

The @NamedStoredProcedureQuery napomena se može koristiti za deklariranje pohranjene procedure:

@NamedStoredProcedureQuery (name = "GetAllFoos", procedureName = "GetAllFoos", resultClasses = {Foo.class}) @Entity javna klasa Foo implementira Serializable {// Definicija modela} 

Da bismo pozvali naš imenovani upit pohranjene procedure, moramo imati instancu EntityManager, a zatim nazovite createNamedStoredProcedureQuery () metoda za stvaranje postupka:

StoredProcedureQuery spQuery = entityManager.createNamedStoredProcedureQuery ("getAllFoos"); 

Možemo izravno dobiti popis Fooentiteta pozivanjem izvršiti() metoda na StoredProcedureQueryobjekt.

4. Pohranjeni postupci s parametrima

Gotovo svi naši pohranjeni postupci zahtijevat će parametre. U ovom ćemo odjeljku pokazati kako pozvati pohranjenu proceduru s parametrima iz Hibernate.

Stvorimo a getFoosByName () pohranjeni postupak u MySQL.

Ovaj postupak vraća popis Foo objekti u kojima se atribut name podudara s fooName parametar:

DELIMITER // STVORI POSTUPAK GetFoosByName (U fooName VARCHAR (255)) JEZIK SQL DETERMINISTIČKI DEFINER SIGURNOSTI SQL POČINI ODABERITI * IZ foo GDJE name = fooName; KRAJ // DELIMITER;

Nazvati GetFoosByName ()U postupku ćemo koristiti imenovane parametre:

Upit upita = session.createSQLQuery ("CALL GetFoosByName (: fooName)") .addEntity (Foo.class) .setParameter ("fooName", "New Foo");

Slično tome, imenovani parametar : fooName može se koristiti s @NamedNativeQuery napomena:

@NamedNativeQuery (name = "callGetFoosByName", query = "CALL GetFoosByName (: fooName)", resultClass = Foo.class)

Imenovani upit nazvao bi se kako slijedi:

Upit upita = session.getNamedQuery ("callGetFoosByName") .setParameter ("fooName", "New Foo");

Kada koristite @NamedStoredProcedureQuery napomena, parametre možemo odrediti pomoću @StoredProcedureParameter bilješka:

@NamedStoredProcedureQuery (name = "GetFoosByName", procedureName = "GetFoosByName", resultClasses = {Foo.class}, parametri = {@StoredProcedureParameter (name = "fooName", type = String.class, mode = ParameterMode.IN)}) 

Možemo se poslužiti registerStoredProcedureParameter () metoda za pozivanje naše pohranjene procedure s fooName parametar:

StoredProcedureQuery spQuery = entityManager. createNamedStoredProcedureQuery ("GetFoosByName") .registerStoredProcedureParameter ("New Foo", String.class, ParameterMode.IN);

5. Zaključak

Ovaj je članak pokazao kako koristiti Hibernate za pozivanje pohranjene procedure u MySQL bazu podataka koristeći različite pristupe.

Vrijedno je to spomenuti ne podržavaju svi RDBMS pohranjene procedure.

Možete pogledati primjere iz ovog članka u povezanom projektu GitHub.