Invocar a procedimientos usando Spring Boot Data JPA

1
2288

Índice de contenidos

1. Introducción

En este tutorial vamos a ver las distintas posibilidades que tenemos a la hora de invocar a procedimientos o métodos almacenados en ORACLE usando Spring Boot Data JPA.

A modo de introducción previa al tutorial os dejo otra forma de hacerlo con Spring JDBC como nos indicaba Daniel en su tutorial.

2. Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro 15′ (2.5 GHz Intel Core i7, 16GB DDR3, 500GB Flash Storage)
  • Sistema Operativo: Mac OS Sierra 10.13.4
  • Entorno de desarrollo: IntelliJ IDEA 2018.1
  • JDK 1.8
  • Apache Maven 3.5.0

3. Dependencias y configuración

Lo primero que haremos será crear un proyecto Maven Spring Boot y añadiremos las siguientes dependencias en el fichero pom.xml:

Tras añadir las dependencias habrá que configurar el datasource en el fichero application.yml:

4. Usando @NamedStoredProcedureQuery

La primera posibilidad que nos da Spring es definir el acceso mediante anotaciones de Java de la siguiente manera:

Tras definir el procedimiento podremos invocarlo usando CrudRepository:

5. Usando createStoredProcedureQuery

La siguiente forma que tenemos para invocar a los procedimientos es usar el método createStoredProcedureQuery(String procedureName) que expone javax.persistence.EntityManager.
De esta forma podremos definir la invocación de los procedimientos de forma dinámica:

También podremos invocar a procedimientos que devuelven un SYS_REFCURSOR y almacenar el resultado en un objecto List de la siguiente manera:

6. Conclusiones

Usar anotaciones hará que tengamos un código más limpio y orientado a JPA pero tiene dos puntos en contra:

  • Solo podremos devolver un único parámetro o un cursor.
  • A nivel conceptual, un procedimiento no pertenece a una tabla sino a la base de datos. Pero Spring nos obliga a anotar la clase @NamedStoredProcedureQuery con @Entity cuando puede que el procedimiento que va a ser invocado devuelva valores que no representan ninguna tabla dentro de nuestro modelo de datos.

Usando createStoredProcedureQuery tendremos muchas más flexibilidad a la hora de obtener todo tipo de valores pero también hará que el código se pueda descontrolar sino tenemos cuidado a la hora de usar este tipo de estructuras.

Un saludo.

Alejandro

aalmazan@autentia.com

1 Comentario

  1. Buenas,
    Personalmente sigo prefiriendo un autogenerador frente a la solución que indicas. El uso de la anotación es muy “cool” pero vas a encontrarte una cantidad de problemas en hacer el mapping de tipos desde java al storedProcedureQuery que dependiendo del número de procedimientos que debas consumir, puede ser tu muerte.

    Saludos.

Dejar respuesta

Please enter your comment!
Please enter your name here