Рубрики
Без рубрики

Хранимые процедуры с гибернацией

В этой статье кратко обсуждается, как вызвать процедуры хранилища из спящего режима.

Автор оригинала: baeldung.

1. Обзор

Хранимые процедуры – это наборы скомпилированных инструкций SQL , находящихся в базе данных. Они используются для инкапсуляции и совместного использования логики с другими программами, а также для использования специфичных для базы данных функций, таких как подсказки индекса или конкретные ключевые слова.

В этой статье показано, как использовать Hibernate для вызова хранимой процедуры в базе данных MySQL .

2. Хранимые процедуры в MySQL

Прежде чем мы обсудим, как вызвать хранимую процедуру из спящего режима, нам нужно ее создать.

Для этого быстрого примера MySQL мы создадим хранимую процедуру , чтобы получить все записи из таблицы foo .

Для создания хранимой процедуры мы используем инструкцию CREATE PROCEDURE :

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

Перед оператором BEGIN мы можем определить необязательные операторы. Вы можете подробно ознакомиться с этими утверждениями, перейдя по официальной документации MySQL ссылке.

Мы можем использовать оператор CALL , чтобы убедиться, что наша процедура ведет себя желаемым образом:

CALL GetAllFoos();

Теперь, когда наша хранимая процедура запущена и запущена, давайте перейдем прямо к тому, как вызвать ее из спящего режима.

3. Вызовите Хранимую Процедуру С Помощью Hibernate

Начиная с Hibernate 3, у нас есть возможность использовать необработанные инструкции SQL, включая хранимые процедуры, для запроса базы данных.

В этом разделе мы рассмотрим, казалось бы, простой пример, который проиллюстрирует, как вызвать процедуру GetAllFoos() с помощью Hibernate.

3.1. Конфигурация

Прежде чем мы начнем писать код, который может выполняться, нам необходимо настроить режим гибернации в нашем проекте.

И, конечно, для всего этого – зависимостей Maven, конфигурации MySQL, конфигурации Hibernate и SessionFactory instantiation – вы можете проверить статью Hibernate .

3.2. Вызов Хранимой процедуры С Помощью метода Create Native SQL

Hibernate позволяет напрямую выражать запросы в формате native SQL . Поэтому мы можем прямо создать собственный SQL-запрос и использовать оператор CALL для вызова хранимой процедуры getAllFoos() :

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

Приведенный выше запрос возвращает список, в котором каждый элемент является объектом Foo o .

Мы используем метод addEntity() для получения объектов сущностей из собственного SQL запроса, в противном случае ClassCastException будет возникать всякий раз, когда хранимая процедура возвращает необработанное значение.

3.3. Вызов Хранимой процедуры С Помощью @NamedNativeQueries

Другой способ вызова хранимой процедуры-использовать аннотацию @NamedNativeQueries .

@NamedNativeQueries используется для указания массива собственных SQL именованных запросов , относящихся к единице сохранения:

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

Каждый именованный запрос, очевидно , имеет атрибут name , фактический SQL-запрос и класс result |, который ссылается на сопоставленную сущность Foo .

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

Атрибут resultClass играет ту же роль, что и метод addEntity() в нашем предыдущем примере.

Оба этих подхода могут использоваться взаимозаменяемо, поскольку между ними нет реальных различий, когда речь идет о производительности или производительности.

3.4. Вызов Хранимой процедуры С помощью @NamedStoredProcedureQuery

Если вы используете JPA 2.1 и Hibernate реализацию EntityManagerFactory | и EntityManager .

Аннотацию @NamedStoredProcedureQuery можно использовать для объявления хранимой процедуры:

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

Чтобы вызвать наш namedstoredprocedurequery, нам нужно создать экземпляр EntityManager, и затем вызвать метод createNamedStoredProcedureQuery() для создания процедуры :

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

Мы можем напрямую получить список сущностей Foo |, вызвав метод execute () в запросе хранимой процедуры | объекта.

4. Хранимые Процедуры С Параметрами

Почти все наши хранимые процедуры будут требовать параметров. В этом разделе мы покажем, как вызвать хранимую процедуру с параметрами из Спящий режим .

Давайте создадим gethostbyname() хранимую процедуру в MySQL .

Эта процедура возвращает список объектов Foo , где атрибут name соответствует параметру foo Name :

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

Для вызова процедуры Gethostbyname() мы будем использовать именованные параметры:

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

Аналогично, именованный параметр :foo Name может использоваться с аннотацией @NamedNativeQuery :

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

Именованный запрос будет вызван следующим образом:

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

При использовании @NamedStoredProcedureQuery аннотации мы можем указать параметры с помощью @StoredProcedureParameter аннотации :

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

Мы можем использовать метод registerStoredProcedureParameter() для вызова нашей хранимой процедуры с именем foo параметром:

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

5. Заключение

Эта статья продемонстрировала как использовать Hibernate для вызова хранимой процедуры в базе данных MySQL с использованием различных подходов.

Стоит отметить, что не все СУБД поддерживают хранимые процедуры .

Вы можете ознакомиться с примерами, приведенными в этой статье, в связанном проекте GitHub .