16.2.2.Использование хранимых процедур для запросов
Hibernate3 обеспечивает поддержку запросов с помощью хранимых процедур и функций.Большая часть следующей документации эквивалентна для обоих.Хранимая процедура / функция должна возвращать набор результатов как первый выходной параметр, чтобы иметь возможность работать с Hibernate.Ниже приведен пример такой хранимой функции в Oracle 9 и выше:
CREATE OR REPLACE FUNCTION selectAllEmployments
RETURN SYS_REFCURSOR
AS
st_cursor SYS_REFCURSOR;
BEGIN
OPEN st_cursor FOR
SELECT EMPLOYEE, EMPLOYER,
STARTDATE, ENDDATE,
REGIONCODE, EID, VALUE, CURRENCY
FROM EMPLOYMENT;
RETURN st_cursor;
END;
Чтобы использовать этот запрос в Hibernate, необходимо сопоставить его с помощью именованного запроса.
<sql-query name="selectAllEmployees_SP" callable="true">
<return alias="emp" class="Employment">
<return-property name="employee" column="EMPLOYEE"/>
<return-property name="employer" column="EMPLOYER"/>
<return-property name="startDate" column="STARTDATE"/>
<return-property name="endDate" column="ENDDATE"/>
<return-property name="regionCode" column="REGIONCODE"/>
<return-property name="id" column="EID"/>
<return-property name="salary">
<return-column name="VALUE"/>
<return-column name="CURRENCY"/>
</return-property>
</return>
{ ? = call selectAllEmployments() }
</sql-query>
Хранимые процедуры в настоящее время возвращают только скаляры и сущности.<return-join>
и <load-collection>
не поддерживаются.
16.2.2.1.Правила / ограничения для использования хранимых процедур
Вы не можете использовать хранимые процедуры в Hibernate, если не будете следовать некоторым правилам процедур / функций.Если они не следуют этим правилам, их нельзя использовать в Hibernate.Если вы все еще хотите использовать эти процедуры, вы должны выполнить их с помощью session.connection()
.Правила различны для каждой базы данных, поскольку поставщики баз данных имеют разную семантику / синтаксис хранимых процедур.
Запросы на хранимые процедуры нельзя разбивать на страницы с помощью setFirstResult()
/ setMaxResults()
.
Рекомендуемая форма вызовастандарт SQL92: { ? = call
functionName(<parameters>) }
или { ?
= call procedureName(<parameters>}
.Собственный синтаксис вызова не поддерживается.
Для Oracle применяются следующие правила:
- Функция должна возвращать набор результатов.Первый параметр процедуры должен быть OUT, который возвращает набор результатов.Это делается с помощью типа SYS_REFCURSOR в Oracle 9 или 10. В Oracle вам нужно определить тип REF CURSOR.Дополнительную информацию смотрите в литературе Oracle.
Для сервера Sybase или MS SQL применяются следующие правила:
Процедура должна возвращать набор результатов.Обратите внимание, что, поскольку эти серверы могут возвращать несколько наборов результатов и количество обновлений, Hibernate будет повторять результаты и принимать первый результат, являющийся набором результатов, в качестве возвращаемого значения.Все остальное будет отброшено.
Если вы можете включить SET NOCOUNT ON в вашей процедуре, это, вероятно, будет более эффективным, но это не является обязательным требованием.