Вызов хранимой процедуры из Java / JPA - PullRequest
87 голосов
/ 26 августа 2010

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

Веб-приложение не может обновлять / удалять данные и использует 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 {call sp_name(?,?)} вместо call sp_name(?,?)
  3. Если хранимая процедура возвращает набор результатов, даже если вы знаете только одну строку, getSingleResult не будет работать
  4. Передайте resultSetMapping имя или данные класса результата

Ответы [ 18 ]

1 голос
/ 16 марта 2017

JPA 2.0 не поддерживает значения RETURN, только вызовы.

Мое решение было. Создайте функцию, вызывающую процедуру.

Итак, внутри кода JAVA вы выполняете NATIVE QUERY, вызывая функцию оракула.

1 голос
/ 08 февраля 2013

Этот ответ может быть полезен, если у вас есть менеджер сущностей

У меня была хранимая процедура для создания следующего номера, а на стороне сервера у меня есть структура шва.

Сторона клиента

 Object on = entityManager.createNativeQuery("EXEC getNextNmber").executeUpdate();
        log.info("New order id: " + on.toString());

Сторона базы данных (сервер SQL) У меня есть хранимая процедура с именем getNextNmber

0 голосов
/ 16 марта 2017

Мое решение было. Создайте функцию, вызывающую процедуру.

Итак, внутри кода JAVA вы выполняете NATIVE QUERY, вызывая функцию оракула. ​​

0 голосов
/ 31 марта 2015

persistence.xml

 <persistence-unit name="PU2" transaction-type="RESOURCE_LOCAL">
<non-jta-data-source>jndi_ws2</non-jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties/>

codigo java

  String PERSISTENCE_UNIT_NAME = "PU2";
    EntityManagerFactory factory2;
    factory2 = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

    EntityManager em2 = factory2.createEntityManager();
    boolean committed = false;
    try {

        try {
            StoredProcedureQuery storedProcedure = em2.createStoredProcedureQuery("PKCREATURNO.INSERTATURNO");
            // set parameters
            storedProcedure.registerStoredProcedureParameter("inuPKEMPRESA", BigDecimal.class, ParameterMode.IN);
            storedProcedure.registerStoredProcedureParameter("inuPKSERVICIO", BigDecimal.class, ParameterMode.IN);
            storedProcedure.registerStoredProcedureParameter("inuPKAREA", BigDecimal.class, ParameterMode.IN);
            storedProcedure.registerStoredProcedureParameter("isbCHSIGLA", String.class, ParameterMode.IN);
            storedProcedure.registerStoredProcedureParameter("INUSINCALIFICACION", BigInteger.class, ParameterMode.IN);
            storedProcedure.registerStoredProcedureParameter("INUTIMBRAR", BigInteger.class, ParameterMode.IN);
            storedProcedure.registerStoredProcedureParameter("INUTRANSFERIDO", BigInteger.class, ParameterMode.IN);
            storedProcedure.registerStoredProcedureParameter("INTESTADO", BigInteger.class, ParameterMode.IN);
            storedProcedure.registerStoredProcedureParameter("inuContador", BigInteger.class, ParameterMode.OUT);

            BigDecimal inuPKEMPRESA = BigDecimal.valueOf(1);
            BigDecimal inuPKSERVICIO = BigDecimal.valueOf(5);
            BigDecimal inuPKAREA = BigDecimal.valueOf(23);
            String isbCHSIGLA = "";
            BigInteger INUSINCALIFICACION = BigInteger.ZERO;
            BigInteger INUTIMBRAR = BigInteger.ZERO;
            BigInteger INUTRANSFERIDO = BigInteger.ZERO;
            BigInteger INTESTADO = BigInteger.ZERO;
            BigInteger inuContador = BigInteger.ZERO;

            storedProcedure.setParameter("inuPKEMPRESA", inuPKEMPRESA);
            storedProcedure.setParameter("inuPKSERVICIO", inuPKSERVICIO);
            storedProcedure.setParameter("inuPKAREA", inuPKAREA);
            storedProcedure.setParameter("isbCHSIGLA", isbCHSIGLA);
            storedProcedure.setParameter("INUSINCALIFICACION", INUSINCALIFICACION);
            storedProcedure.setParameter("INUTIMBRAR", INUTIMBRAR);
            storedProcedure.setParameter("INUTRANSFERIDO", INUTRANSFERIDO);
            storedProcedure.setParameter("INTESTADO", INTESTADO);
            storedProcedure.setParameter("inuContador", inuContador);

            // execute SP
            storedProcedure.execute();
            // get result

            try {
                long _inuContador = (long) storedProcedure.getOutputParameterValue("inuContador");
                varCon = _inuContador + "";
            } catch (Exception e) {
            } 
        } finally {

        }
    } finally {
        em2.close();
    }
0 голосов
/ 22 сентября 2014

Вы можете использовать @Query(value = "{call PROC_TEST()}", nativeQuery = true) в своем хранилище.Это сработало для меня.

Внимание: используйте '{' и '}', иначе это не будет работать.

0 голосов
/ 13 апреля 2013

Попробуйте этот код:

return em.createNativeQuery("{call getEmployeeDetails(?,?)}",
                               EmployeeDetails.class)           
                               .setParameter(1, employeeId)
                               .setParameter(2, companyId).getResultList();
0 голосов
/ 15 марта 2019

В JPA 2.1 JPA поддерживает вызов хранимых процедур с использованием динамического StoredProcedureQuery и декларативного @ NamedStoredProcedureQuery.

0 голосов
/ 26 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...