Ejecutar Stored Procedures con JPA 2.1



Hoy generamos en mi trabajo una nueva versión para UAT (User Acceptance Test) y nos dimos con este problema.

Problema

Teníamos que llamar a dos stored procedures usando SimpleJdbcCall.
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(spJdbcTemplate).withProcedureName(“DELETE_LANE”);
Map in = new HashMap<>();
in.put(“V_LANE_ID”, laneId);

Map out = jdbcCall.execute(in);
El Stored procedure solo recibe un parámetro y no retorna nada, pero, si ejecuta varias operaciones intermedias que omito para este post.


Si bien en nuestro entorno de desarrollo trabajo muy bien, en UAT nos dio este problema:



Que se resume en: “Unable to determine the correct call signature - no procedure/function/signature for ‘DELETE_LANE'”.

Solución

Deduje que no resolvía bien el tipo del parámetro de entrada y que debía ser más explícito. Por suerte, ya sabía que en la versión de JPA 2.1 había soporte para stored procedures, así que procedí a implementarlo:
En la entidad Lane.java añadí el nuevo @NamedStoredProcedureQuery. El atributo name es el nombre interno que usarás en tu aplicación, el valor en procedureName es el nombre real del procedimiento almacenado y luego vienen los parameters donde debes indicar si es IN o OUT , tipo y nombre. Lo cual ya “adivinaba” me ayudaría a resolver mi problema.


Luego tocaba dejar de usar SimpleJdbcCall y usar esta nueva forma de ejecución de stored procedure:


Con 3 simples líneas:
StoredProcedureQuery query = this.em.createNamedStoredProcedureQuery(“deleteLane”);
query.setParameter(“V_LANE_ID”, laneId);
query.execute();
Eso sí como ven necesitan el EntityManager.  Pero en proyectos con Spring Boot es muy sencillo basta un @PersistenceContext private EntityManager em y eso es todo.



Y bueno eso es todo, se volvió a probar, desplegar en UAT y está funcionando muy bien.
Enjoy!





Share:

2 comentarios:

  1. José, gracias por compartir tus conocimientos a través de tu blog, un consejo quizá podría compartir un link de descarga en cada entrada, que contenga el código fuente ya que muchas veces uno se suele perder un poco y a veces hay problemas con la configuración y versiones. Muy buen blog, lo compartiré

    ResponderBorrar
    Respuestas
    1. Tienes mucha razón , voy a seguir tus recomendaciones, post publicado y si involucra código lo tendré listo y publicado en github.com/joedayz.

      Borrar