Hibernate предоставляет три основных способа для вызова хранимых процедур в базах данных. Каждый подход даёт разный уровень гибкости и удобства поддержки в зависимости от требований твоего проекта.
Определи хранимую процедуру в файле Hibernate-маппинга, используя элементы <sql-query>:
<sql-query name="callEmployeeStoreProcedure">
<return alias="employee" class="com.testHibernate.util.Employee"/>
<![CDATA[CALL GetEmployees(:employeeId)]]>
</sql-query>
Выполни процедуру через getNamedQuery():
Query query = session.getNamedQuery("callEmployeeStoreProcedure")
.setParameter("employeeId", "1234");
List result = query.list();
Вызови хранимую процедуру напрямую через встроенный SQL без конфигурации маппинга:
Query query = session.createSQLQuery("CALL GetEmployees(:employeeId)")
.addEntity(Employee.class)
.setParameter("employeeId", "1234");
List result = query.list();
Этот подход гибче для динамических запросов, но хуже подходит для повторного использования.
Используй аннотацию @NamedNativeQuery на классе сущности для современного, code-first подхода:
@NamedNativeQueries({
@NamedNativeQuery(
name = "callEmployeeStoreProcedure",
query = "CALL GetEmployees(:employeeId)",
resultClass = Employee.class
)
})
@Entity
@Table(name = "employee")
public class Employee implements Serializable {
// реализация класса
}
Выполняется тем же методом getNamedQuery(), что и при XML-маппинге.
setParameter() для защиты от SQL-инъекцийПодход с аннотацией @NamedNativeQuery требует определения вызовов хранимых процедур в отдельных XML-файлах маппинга, а не внутри самого класса сущности.
Новый — ещё не проверен сообществом
Вы