Вызов хранимой процедуры из Java / JPA

Я пишу простое веб-приложение для вызова хранимой процедуры и получения некоторых данных. Это очень простое приложение, которое взаимодействует с базой данных клиента. Мы передаем идентификатор сотрудника и идентификатор компании, и хранимая процедура возвращает сведения о сотруднике.

Веб-приложение не может обновить / удалить данные и использует 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();

Вещи, которые я заметил:

  1. Имена параметров у меня не работали, поэтому попробуйте использовать индекс параметров.
  2. Исправить SQL-оператор {вызвать sp_name (?,?)} вместо вызвать sp_name (?,?)
  3. Если хранимая процедура возвращает набор результатов, даже если вы знаете с только одна строка, getSingleResult не будет работать
  4. Передать resultSetMapping имя или сведения о классе результатов
91
задан bish 5 November 2015 в 10:28
поделиться

3 ответа

Я развертываю свое веб-приложение в Jboss AS. Должен ли я использовать JPA для доступа к хранимой процедуре или CallableStatement. Любое преимущество использования JPA в этом случае.

На самом деле это не поддерживается JPA, но выполнимо. Тем не менее, я бы не пошел по этому пути:

  • использование JPA только для сопоставления результата вызова хранимой процедуры в некоторых bean-компонентах действительно излишне,
  • особенно с учетом того, что 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();

Ссылка

22
ответ дан 24 November 2019 в 06:51
поделиться

Для вызова хранимой процедуры мы можем использовать оператор Callable в пакете java.sql.

0
ответ дан 24 November 2019 в 06:51
поделиться

Вам необходимо передать параметры хранимой процедуре.

Это должно работать так:

    List result = em
      .createNativeQuery("call getEmployeeDetails(:employeeId,:companyId)")
      .setParameter("emplyoyeeId", 123L)
      .setParameter("companyId", 456L)
      .getResultList();

Обновление:

А может, и не должно.

В книге EJB3 в действии на странице 383 говорится, что JPA не поддерживает хранимые процедуры (страница является только предварительным просмотром, вы не получите полный текст , вся книга доступна для скачивания в нескольких местах, включая этот, хотя я не знаю, законно ли это).

В любом случае, текст такой:

Хранимые процедуры JPA и базы данных

Если вы большой поклонник SQL, возможно, вам желание использовать силу хранимые процедуры базы данных. К сожалению, JPA не поддерживает хранимые процедуры, и вы должны зависит от фирменной особенности ваш поставщик постоянства. Тем не мение, вы можете использовать простые хранимые функции (без параметров) с родным SQL-запрос.

9
ответ дан 24 November 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: