Gespeicherte Prozeduren im Ruhezustand

1. Übersicht

Gespeicherte Prozeduren sind Sätze kompilierter SQL-Anweisungen, die sich in der Datenbank befinden. Sie werden verwendet, um Logik zu kapseln und mit anderen Programmen zu teilen, und profitieren von datenbankspezifischen Funktionen wie Indexhinweisen oder bestimmten Schlüsselwörtern.

Dieser Artikel zeigt, wie Sie mit Hibernate eine gespeicherte Prozedur in einer MySQL-Datenbank aufrufen .

2. Gespeicherte Prozeduren in MySQL

Bevor wir diskutieren, wie eine gespeicherte Prozedur aus dem Ruhezustand aufgerufen wird, müssen wir sie erstellen.

In diesem kurzen MySQL-Beispiel erstellen wir eine gespeicherte Prozedur, um alle Datensätze aus einer foo- Tabelle abzurufen .

Um eine gespeicherte Prozedur zu erstellen, verwenden wir die Anweisung CREATE PROCEDURE :

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

Vor der BEGIN- Anweisung können wir optionale Anweisungen definieren. Sie können die Details dieser Anweisungen detailliert beschreiben, indem Sie dem offiziellen MySQL-Dokumentationslink folgen.

Mit der CALL- Anweisung können wir sicherstellen, dass sich unsere Prozedur wie gewünscht verhält:

CALL GetAllFoos();

Nachdem wir unsere gespeicherte Prozedur eingerichtet und ausgeführt haben, können Sie direkt mit dem Aufruf aus dem Ruhezustand beginnen.

3. Rufen Sie eine gespeicherte Prozedur mit Ruhezustand auf

Ab Hibernate 3 haben wir die Möglichkeit, eine SQL-Rohanweisung einschließlich gespeicherter Prozeduren zum Abfragen einer Datenbank zu verwenden.

In diesem Abschnitt werden wir ein scheinbar einfaches Beispiel durchgehen, das veranschaulicht, wie die Prozedur GetAllFoos () mit Hibernate aufgerufen wird .

3.1. Aufbau

Bevor wir Code schreiben können, der ausgeführt werden kann, müssen wir den Ruhezustand in unserem Projekt konfiguriert haben.

Und natürlich können Sie für all das - die Maven-Abhängigkeiten, die MySQL-Konfiguration, die Hibernate-Konfiguration und die SessionFactory- Instanziierung - den Hibernate-Artikel lesen .

3.2. Rufen Sie eine gespeicherte Prozedur mit der CreateNativeSQL- Methode auf

Im Ruhezustand können Abfragen direkt im nativen SQL- Format ausgedrückt werden. Daher können wir einfach eine native SQL-Abfrage erstellen und die CALL- Anweisung verwenden, um die gespeicherte Prozedur getAllFoos () aufzurufen :

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

Die obige Abfrage gibt eine Liste zurück, in der jedes Element ein Foo- Objekt ist.

Wir verwenden die Methode addEntity () , um Entitätsobjekte aus der nativen SQL- Abfrage abzurufen. Andernfalls wird eine ClassCastException ausgelöst, wenn eine gespeicherte Prozedur einen nicht rohen Wert zurückgibt.

3.3. Rufen Sie eine gespeicherte Prozedur mit @NamedNativeQueries auf

Eine andere Möglichkeit, eine gespeicherte Prozedur aufzurufen, besteht darin, die Annotation @NamedNativeQueries zu verwenden .

@NamedNativeQueries wird verwendet, um ein Array nativer SQL- Abfragen mit Namen für die Persistenz-Einheit anzugeben :

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

Jede benannte Abfrage hat natürlich einen Namen Attribut, die tatsächliche SQL - Abfrage und die result , die bezieht sich auf die Foo Entität abgebildet.

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

Das resultClass- Attribut spielt dieselbe Rolle wie die addEntity () -Methode in unserem vorherigen Beispiel.

Beide Ansätze können austauschbar verwendet werden, da es keine wirklichen Unterschiede zwischen den beiden gibt, wenn es um Leistung oder Produktivität geht.

3.4. Rufen Sie eine gespeicherte Prozedur mit @NamedStoredProcedureQuery auf

Wenn Sie JPA 2.1 und die Hibernate- Implementierung von EntityManagerFactory und EntityManager verwenden .

Die Annotation @NamedStoredProcedureQuery kann verwendet werden, um eine gespeicherte Prozedur zu deklarieren:

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

Um unsere benannte Abfrage für gespeicherte gespeicherte Prozeduren aufzurufen, müssen wir einen EntityManager instanziiert haben und dann die Methode createNamedStoredProcedureQuery () aufrufen , um die Prozedur zu erstellen :

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

Wir können die Liste der Foo- Entitäten direkt abrufen, indem wir die execute () -Methode für das StoredProcedureQuery- Objekt aufrufen .

4. Gespeicherte Prozeduren mit Parametern

Fast alle unsere gespeicherten Prozeduren erfordern Parameter. In diesem Abschnitt wird gezeigt, wie eine gespeicherte Prozedur mit Parametern aus dem Ruhezustand aufgerufen wird .

Erstellen wir eine gespeicherte Prozedur getFoosByName () in MySQL .

Diese Prozedur gibt eine Liste von Foo- Objekten zurück, deren Namensattribut mit dem Parameter fooName übereinstimmt :

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

Um die GetFoosByName () -Prozedur aufzurufen , verwenden wir benannte Parameter:

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

In ähnlicher Weise die benannten Parameter : fooName mit dem verwendet werden @NamedNativeQuery Anmerkung:

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

Die benannte Abfrage würde wie folgt aufgerufen:

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

Bei Verwendung der Annotation @NamedStoredProcedureQuery können Parameter mithilfe der Annotation @StoredProcedureParameter angegeben werden :

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

Wir können die Methode registerStoredProcedureParameter () verwenden, um unsere gespeicherte Prozedur mit dem Parameter fooName aufzurufen :

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

5. Schlussfolgerung

In diesem Artikel wurde gezeigt, wie Sie mit Hibernate eine gespeicherte Prozedur in einer MySQL-Datenbank mit verschiedenen Ansätzen aufrufen können .

Es ist erwähnenswert, dass nicht alle RDBMS gespeicherte Prozeduren unterstützen .

Sie können die in diesem Artikel bereitgestellten Beispiele im verknüpften GitHub-Projekt überprüfen.