Prosedur yang Disimpan dengan Hibernate

1. Gambaran keseluruhan

Prosedur Tersimpan adalah kumpulan penyataan SQL yang tersusun yang berada di dalam pangkalan data. Mereka digunakan untuk merangkum dan berbagi logik dengan program lain, dan memanfaatkan fitur khusus pangkalan data seperti petunjuk indeks atau kata kunci tertentu.

Artikel ini menunjukkan cara menggunakan Hibernate untuk memanggil prosedur yang tersimpan dalam pangkalan data MySQL .

2. Prosedur Tersimpan di MySQL

Sebelum kita membincangkan cara memanggil prosedur tersimpan dari Hibernate, kita perlu membuatnya.

Untuk contoh MySQL cepat ini, kami akan membuat prosedur tersimpan untuk mendapatkan semua rekod dari jadual foo .

Untuk membuat prosedur yang tersimpan, kami menggunakan penyataan CREATE PROCEDURE :

DELIMITER // CREATE PROCEDURE GetAllFoos() LANGUAGE SQL DETERMINISTIC SQL SECURITY DEFINER BEGIN SELECT * FROM foo; END // DELIMITER;

Sebelum pernyataan BEGIN , kita dapat menentukan pernyataan pilihan. Anda boleh melihat perincian penyataan ini dengan mengikuti pautan dokumentasi MySQL rasmi.

Kita boleh menggunakan pernyataan CALL untuk memastikan bahawa prosedur kita berkelakuan dengan cara yang diinginkan:

CALL GetAllFoos();

Sekarang kita sudah menjalankan prosedur tersimpan kita, mari kita terus menerus bagaimana memanggilnya dari Hibernate.

3. Panggil Prosedur Tersimpan Dengan Hibernate

Bermula dari Hibernate 3, kita mempunyai kemungkinan untuk menggunakan pernyataan SQL mentah termasuk prosedur yang tersimpan untuk membuat pertanyaan pada pangkalan data.

Dalam bahagian ini, kita akan melalui contoh yang nampaknya asas yang akan menggambarkan bagaimana memanggil prosedur GetAllFoos () menggunakan Hibernate.

3.1. Konfigurasi

Sebelum kita mula menulis kod yang boleh dijalankan, kita perlu mengkonfigurasi Hibernate dalam projek kita.

Dan tentu saja untuk semua itu - kebergantungan Maven, konfigurasi MySQL, konfigurasi Hibernate dan instansiasi SessionFactory - anda boleh melihat artikel Hibernate.

3.2. Panggil Prosedur Tersimpan Menggunakan Kaedah CreateNativeSQL

Hibernate memungkinkan untuk menyatakan pertanyaan dalam format SQL asli secara langsung. Oleh itu, kita dapat membuat pertanyaan SQL asli secara langsung, dan menggunakan pernyataan CALL untuk memanggil prosedur getAllFoos () yang tersimpan:

Query query = session.createSQLQuery("CALL GetAllFoos()").addEntity(Foo.class); List allFoos = query.list(); 

Pertanyaan di atas mengembalikan senarai di mana setiap elemen adalah Foo o bject.

Kami menggunakan kaedah addEntity () untuk mendapatkan objek entiti dari pertanyaan SQL asli , jika tidak, ClassCastException akan dilemparkan setiap kali prosedur yang disimpan mengembalikan nilai bukan mentah.

3.3. Panggil Prosedur Tersimpan Menggunakan @NamedNativeQueries

Cara lain untuk memanggil prosedur yang disimpan adalah dengan menggunakan anotasi @NamedNativeQueries .

@NamedNativeQueries digunakan untuk menentukan pelbagaipertanyaan bernama SQL asli yang dilampirkan ke unit kegigihan:

@NamedNativeQueries({ @NamedNativeQuery( name = "callGetAllFoos", query = "CALL GetAllFoos()", resultClass = Foo.class) }) @Entity public class Foo implements Serializable { // Model definition }

Setiap pertanyaan bernama jelas mempunyai atribut nama , pertanyaan SQL yang sebenarnya , dan hasilClass yang merujuk kepada entiti yang dipetakan Foo .

Query query = session.getNamedQuery("callGetAllFoos"); List allFoos = query.list();

The resultClass atribut memainkan peranan yang sama dengan addEntity () kaedah dalam contoh sebelumnya.

Kedua-dua pendekatan ini dapat digunakan secara bergantian, kerana tidak ada perbezaan nyata antara keduanya dalam hal prestasi atau produktivitas.

3.4. Panggil Prosedur Tersimpan Menggunakan @NamedStoredProcedureQuery

Sekiranya anda menggunakan JPA 2.1 dan pelaksanaan Hibernate dari EntityManagerFactory dan EntityManager .

The @NamedStoredProcedureQuery anotasi boleh digunakan untuk mengisytiharkan prosedur yang disimpan:

@NamedStoredProcedureQuery( name="GetAllFoos", procedureName="GetAllFoos", resultClasses = { Foo.class } ) @Entity public class Foo implements Serializable { // Model Definition } 

Untuk memanggil pertanyaan prosedur tersimpan bernama kami, kami perlu membuat EntityManager, dan kemudian memanggil kaedah createNamedStoredProcedureQuery () untuk membuat prosedur :

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

Kita boleh mendapatkan senarai entiti Foo secara langsung dengan memanggil kaedah eksekusi () pada objek StoredProcedureQuery .

4. Prosedur yang Disimpan Dengan Parameter

Hampir semua prosedur tersimpan kami memerlukan parameter. Di bahagian ini, kita akan menunjukkan cara memanggil prosedur yang tersimpan dengan parameter dari Hibernate .

Mari buat prosedur tersimpan getFoosByName () di MySQL .

Prosedur ini mengembalikan senarai objek Foo di mana atribut name sepadan dengan parameter fooName :

DELIMITER // CREATE PROCEDURE GetFoosByName(IN fooName VARCHAR(255)) LANGUAGE SQL DETERMINISTIC SQL SECURITY DEFINER BEGIN SELECT * FROM foo WHERE name = fooName; END // DELIMITER;

Untuk memanggil prosedur GetFoosByName () kita akan menggunakan parameter bernama:

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

Begitu juga, parameter bernama : fooName dapat digunakan dengan anotasi @NamedNativeQuery :

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

Pertanyaan yang disebut akan dipanggil sebagai berikut:

Query query = session.getNamedQuery("callGetFoosByName") .setParameter("fooName","New Foo");

Semasa menggunakan anotasi @NamedStoredProcedureQuery , kami dapat menentukan parameter menggunakan anotasi @StoredProcedureParameter :

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

Kita boleh menggunakan kaedah registerStoredProcedureParameter () untuk memanggil prosedur yang disimpan dengan parameter fooName :

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

5. Kesimpulan

Artikel ini menunjukkan cara menggunakan Hibernate untuk memanggil prosedur yang tersimpan dalam pangkalan data MySQL menggunakan pendekatan yang berbeza.

Perlu disebutkan bahawa tidak semua RDBMS menyokong prosedur yang tersimpan .

Anda boleh melihat contoh yang diberikan dalam artikel ini dalam projek GitHub yang dipautkan.