Я пишу простое веб-приложение для вызова хранимой процедуры и получения некоторых данных. Это очень простое приложение, которое взаимодействует с базой данных клиента. Мы передаем идентификатор сотрудника и идентификатор компании, и хранимая процедура возвращает сведения о сотруднике.
Веб-приложение не может обновить / удалить данные и использует SQL Server.
Я развертываю свое веб-приложение в Jboss AS. Должен ли я использовать JPA для доступа к хранимой процедуре или CallableStatement
. Любое преимущество использования JPA в этом случае.
Также, что будет оператором sql для вызова этой хранимой процедуры. Я никогда не использовал хранимые процедуры раньше, и я борюсь с этим. Google не сильно помог.
Вот хранимая процедура:
CREATE procedure getEmployeeDetails (@employeeId int, @companyId int)
as
begin
select firstName,
lastName,
gender,
address
from employee et
where et.employeeId = @employeeId
and et.companyId = @companyId
end
Обновление:
Для всех, у кого возникли проблемы с вызовом хранимой процедуры с использованием JPA .
Query query = em.createNativeQuery("{call getEmployeeDetails(?,?)}",
EmployeeDetails.class)
.setParameter(1, employeeId)
.setParameter(2, companyId);
List<EmployeeDetails> result = query.getResultList();
Вещи, которые я заметил:
{вызвать sp_name (?,?)}
вместо вызвать sp_name (?,?)
getSingleResult
не будет работать resultSetMapping
имя или сведения о классе результатов Я развертываю свое веб-приложение в Jboss AS. Должен ли я использовать JPA для доступа к хранимой процедуре или CallableStatement. Любое преимущество использования JPA в этом случае.
На самом деле это не поддерживается JPA, но выполнимо. Тем не менее, я бы не пошел по этому пути:
Таким образом, я бы предпочел использовать Spring для доступа к данным JDBC или средство отображения данных, такое как MyBatis, или, учитывая простоту вашего приложения, необработанный JDBC и CallableStatement
. На самом деле, JDBC, вероятно, был бы моим выбором. Вот базовый пример:
CallableStatement cstmt = con.prepareCall("{call getEmployeeDetails(?, ?)}");
cstmt.setInt("employeeId", 123);
cstmt.setInt("companyId", 456);
ResultSet rs = cstmt.executeQuery();
Для вызова хранимой процедуры мы можем использовать оператор Callable в пакете java.sql.
Вам необходимо передать параметры хранимой процедуре.
Это должно работать так:
List result = em
.createNativeQuery("call getEmployeeDetails(:employeeId,:companyId)")
.setParameter("emplyoyeeId", 123L)
.setParameter("companyId", 456L)
.getResultList();
Обновление:
А может, и не должно.
В книге EJB3 в действии на странице 383 говорится, что JPA не поддерживает хранимые процедуры (страница является только предварительным просмотром, вы не получите полный текст , вся книга доступна для скачивания в нескольких местах, включая этот, хотя я не знаю, законно ли это).
В любом случае, текст такой:
Если вы большой поклонник SQL, возможно, вам желание использовать силу хранимые процедуры базы данных. К сожалению, JPA не поддерживает хранимые процедуры, и вы должны зависит от фирменной особенности ваш поставщик постоянства. Тем не мение, вы можете использовать простые хранимые функции (без параметров) с родным SQL-запрос.