Estoy escribiendo una aplicación web simple para llamar a un procedimiento almacenado y recuperar algunos datos. Es una aplicación muy simple, que interactúa con la base de datos del cliente. Pasamos la identificación del empleado y la identificación de la empresa y el procedimiento almacenado devolverá los detalles del empleado.
La aplicación web no puede actualizar / eliminar datos y está usando SQL Server.
Estoy implementando mi aplicación web en Jboss AS. ¿Debo usar JPA para acceder al procedimiento almacenado o CallableStatement
. Cualquier ventaja de usar JPA en este caso.
Además, ¿cuál será la instrucción SQL para llamar a este procedimiento almacenado? Nunca antes había usado procedimientos almacenados y estoy luchando con este. Google no fue de mucha ayuda.
Aquí está el procedimiento almacenado:
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
Actualizar:
Para cualquier otra persona que tenga problemas para llamar al procedimiento almacenado usando JPA .
Query query = em.createNativeQuery("{call getEmployeeDetails(?,?)}",
EmployeeDetails.class)
.setParameter(1, employeeId)
.setParameter(2, companyId);
List<EmployeeDetails> result = query.getResultList();
Cosas que he notado:
- Los nombres de los parámetros no me funcionaron, así que intente usar el índice de parámetros.
- Corregir la declaración de SQL en
{call sp_name(?,?)}
lugar decall sp_name(?,?)
- Si el procedimiento almacenado devuelve un conjunto de resultados, incluso si sabe que solo tiene una fila,
getSingleResult
no funcionará - Pasar un
resultSetMapping
nombre o detalles de la clase de resultado
Respuestas:
JPA 2.1 ahora es compatible con el procedimiento almacenado, lea el documento de Java aquí .
Ejemplo:
Vea un ejemplo detallado aquí .
fuente
Realmente no es compatible con JPA, pero es factible . Aún así, no iría por este camino:
Por lo tanto, preferiría considerar usar el soporte de Spring para el acceso a datos JDBC , o un mapeador de datos como MyBatis o, dada la simplicidad de su aplicación, JDBC sin formato y
CallableStatement
. En realidad, JDBC probablemente sería mi elección. Aquí hay un ejemplo básico de inicio:Referencia
fuente
Debe pasar los parámetros al procedimiento almacenado.
Debería funcionar así:
Actualizar:
O tal vez no debería.
En el Libro EJB3 en acción , dice en la página 383, que JPA no admite procedimientos almacenados (la página es solo una vista previa, no se obtiene el texto completo, el libro completo está disponible como descarga en varios lugares, incluido este , Aunque no sé si esto es legal).
De todos modos, el texto es este:
Procedimientos almacenados de base de datos y JPA
fuente
Cómo recuperar el parámetro de salida del procedimiento almacenado usando JPA (2.0 necesita importaciones de EclipseLink y 2.1 no)
A pesar de que esta respuesta detalla la devolución de un conjunto de registros de un procedimiento almacenado, estoy publicando aquí, porque me tomó años resolverlo y este hilo me ayudó.
Mi aplicación estaba usando Eclipselink-2.3.1, pero forzaré una actualización a Eclipselink-2.5.0, ya que JPA 2.1 tiene mucho mejor soporte para procedimientos almacenados.
Uso de EclipseLink-2.3.1 / JPA-2.0: dependiente de la implementación
Este método requiere la importación de clases de EclipseLink desde "org.eclipse.persistence", por lo que es específico para la implementación de Eclipselink.
Lo encontré en " http://www.yenlo.nl/en/calling-oracle-stored-procedures-from-eclipselink-with-multiple-out-parameters ".
Usando EclipseLink-2.5.0 / JPA-2.1: Independiente de la implementación (documentado ya en este hilo)
Este método es independiente de la implementación (no necesita importaciones de Eclipslink).
fuente
xml
archivo y no funcionó. No puedo leer elOUT
parámetro.Para un procedimiento almacenado simple que usa parámetros IN / OUT como este
Puede llamarlo desde JPA de la siguiente manera:
Para un procedimiento almacenado que usa un
SYS_REFCURSOR
parámetro OUT:Puede llamarlo de la siguiente manera:
Para una función SQL que tiene el siguiente aspecto:
Puedes llamarlo así:
Al menos cuando se usa Hibernate 4.xy 5.x porque el JPA
StoredProcedureQuery
no funciona para las FUNCIONES SQL.Para obtener más detalles sobre cómo llamar a funciones y procedimientos almacenados cuando se usa JPA e Hibernate, consulte los siguientes artículos
fuente
createNativeQuery
. Cambié acreateStoredProcedureQuery
. Entonces, ¡voilá!Para mí, solo lo siguiente funcionó con Oracle 11g y Glassfish 2.1 (Toplink):
La variante con llaves resultó en ORA-00900.
fuente
Si usa EclipseLink, puede usar @NamedStoredProcedureQuery o StoreProcedureCall para ejecutar cualquier procedimiento almacenado, incluidos aquellos con parámetros de salida o cursores de salida. También está disponible el soporte para funciones almacenadas y tipos de datos PLSQL.
Véase http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Stored_Procedures
fuente
Lo siguiente funciona para mí:
fuente
Puede que no sea lo mismo para Sql Srver, pero para las personas que usan oracle y eclipslink está funcionando para mí
ej: un procedimiento que tiene un parámetro IN (tipo CHAR) y dos parámetros OUT (NUMBER & VARCHAR)
en persistence.xml declare la unidad de persistencia:
y declarar la estructura del proceso en eclipselink-orm.xml
en el código solo tienes que llamar a tu proc así:
para obtener los dos parámetros de salida:
fuente
Esto funcionó para mí.
Nota: en el futuro, si decide usar la versión predeterminada de findOne, simplemente comente la anotación NamedNativeQueries y JPA cambiará a la predeterminada
fuente
Esta respuesta puede ser útil si tiene un administrador de entidad
Tenía un procedimiento almacenado para crear el siguiente número y en el lado del servidor tengo un marco de costura.
Lado del cliente
Lado de la base de datos (servidor SQL) Tengo un procedimiento almacenado llamado
getNextNmber
fuente
Puedes usar
@Query(value = "{call PROC_TEST()}", nativeQuery = true)
en su repositorio. Esto funcionó para mí.Atención: use '{' y '}' o de lo contrario no funcionará.
fuente
JPA 2.0 no admite valores RETURN, solo llamadas.
Mi solución fue. Cree una FUNCIÓN que llame al PROCEDIMIENTO.
Entonces, dentro del código JAVA, ejecuta una CONSULTA NATIVA llamando a la FUNCIÓN de oracle.
fuente
Para llamar al procedimiento almacenado, podemos usar Callable Statement en el paquete java.sql.
fuente
Prueba este código:
fuente
persistence.xml
codigo java
fuente
Desde JPA 2.1, JPA admite la llamada a procedimientos almacenados utilizando StoredProcedureQuery dinámico y @NamedStoredProcedureQuery declarativo.
fuente
Mi solución fue. Cree una FUNCIÓN que llame al PROCEDIMIENTO.
Entonces, dentro del código JAVA, ejecuta una CONSULTA NATIVA llamando a la FUNCIÓN de oracle.
fuente