Gespeicherte Prozeduren mit Ruhezustand

Gespeicherte Prozeduren mit Ruhezustand

1. Überblick

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

Dieser Artikel zeigt, wie SieHibernate verwenden, umstored procedure inMySQL database aufzurufen.

2. Gespeicherte Prozeduren in MySQL

Bevor wir uns mit dem Aufrufen einer gespeicherten Prozedur aus dem Ruhezustand befassen, müssen wir sie erstellen.

In diesem kurzen MySQL-Beispiel werdencreate a stored procedure verwendet, um alle Datensätze aus einerfoo-Tabelle abzurufen.

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

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

Vor der AnweisungBEGINkönnen optionale Anweisungen definiert werden. Sie können die Details dieser Anweisungen genauer untersuchen, indem Sie dem offiziellen LinkMySQL documentationfolgen.

Wir können die AnweisungCALLverwenden, um sicherzustellen, dass sich unsere Prozedur wie gewünscht verhält:

CALL GetAllFoos();

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

3. Rufen Sie eine gespeicherte Prozedur mit Ruhezustand auf

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

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

3.1. Aufbau

Bevor wir Code schreiben, 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 Instanziierung vonSessionFactory- dieHibernate article überprüfen.

3.2. Rufen Sie eine gespeicherte Prozedur mit derCreateNativeSQL-Methode auf

Im Ruhezustand können Abfragen direkt im Formatnative SQLausgedrückt werden. Daher können wir einfach eine native SQL-Abfrage erstellen und die gespeicherte ProzedurgetAllFoos()mit der AnweisungCALLaufrufen:

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 einFoo object ist.

Wir verwenden die MethodeaddEntity(), um Entitätsobjekte aus der nativen AbfrageSQLabzurufen. Andernfalls wird einClassCastException 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@NamedNativeQuerieszu verwenden.

@NamedNativeQueries wird verwendet, um ein Array von nativenSQL-Abfragenscoped to the persistence unit: anzugeben

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

Jede benannte Abfrage hat offensichtlich einname-Attribut, das tatsächlicheSQL query und dasresultClass, die sich auf die zugeordnete EntitätFoobeziehen.

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

Das AttributresultClass spielt dieselbe Rolle wie die MethodeaddEntity() 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 SieJPA 2.1 und dieHibernate-Implementierung vonEntityManagerFactory undEntityManager 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 Prozeduren aufzurufen, müssen wir einEntityManager, instanziiert haben und dann die MethodecreateNamedStoredProcedureQuery() aufrufen, um die Prozedur: zu erstellen

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

Wir können die Liste der Entitäten vonFoodirekt abrufen, indem wir die Methodeexecute()für das Objekt vonStoredProcedureQueryaufrufen.

4. Gespeicherte Prozeduren mit Parametern

Fast alle unsere gespeicherten Prozeduren erfordern Parameter. In diesem Abschnitt zeigen wir, wie eine gespeicherte Prozedur mit Parametern vonHibernate aufgerufen wird.

Erstellen wir eine gespeicherte Prozedur vongetFoosByName()inMySQL.

Diese Prozedur gibt eine Liste der Objekte vonFoozurück, wobei das Attribut name mit dem ParameterfooNameü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 ProzedurGetFoosByName()aufzurufen, verwenden wir benannte Parameter:

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

In ähnlicher Weise kann der benannte Parameter:fooName mit der Annotation@NamedNativeQuery verwendet werden:

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

Die genannte Abfrage würde wie folgt aufgerufen:

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

Bei Verwendung der Annotation@NamedStoredProcedureQuery können wir Parameter mit@StoredProcedureParameter annotation angeben:

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

Wir können die MethoderegisterStoredProcedureParameter() verwenden, um unsere gespeicherte Prozedur mit dem ParameterfooName aufzurufen:

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

5. Fazit

Dieser Artikel demonstriertehow to use Hibernate to call a stored procedure in a MySQL database unter Verwendung verschiedener Ansätze.

Es ist erwähnenswert, dassnot all RDBMS support stored procedures.

Sie können die in diesem Artikel bereitgestellten Beispiele in den verknüpftenGitHub project überprüfen.