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); ListallFoos = 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"); ListallFoos = 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 .