Es esta entrada les quiero compartir como invocar un Store Procedure con Parametros de Salida y recuperarlos por medio de Hibernate.
Es ejemplo lo realizo con la Base de datos Oracle 11g XE y con la versión de Hibernate 4.3.
Codigo del Store Procedure.
A continuación el código con la explicación:
package com.oscarblancarte.hibernate; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.persistence.ParameterMode; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.procedure.ProcedureCall; import org.hibernate.service.ServiceRegistry; public class HibernateProcedure { private static final SessionFactory sessionFactory = buildSessionFactory(); public static void main(String[] args) { // Obtenemos la session Session session = getSessionFactory().getCurrentSession(); // Abrimos transacción <OPCIONAL> session.beginTransaction(); // Nombre del SP ProcedureCall call = session.createStoredProcedureCall("PROC1"); // Registramos el primer parametros de entrada call.registerParameter(1, String.class, ParameterMode.IN); // Registramos el segundo parametro de salida call.registerParameter(2, Integer.class, ParameterMode.OUT); //Establecemos el valor del primer parametros de entrada call.getParameterRegistration(1).bindValue("hola"); //Ejecutamos el SP y obtenemos el parametro 2, el cual es de salida(out) Object salida = call.getOutputs().getOutputParameterValue(2); //Se imprime el parametro de salida System.out.println("SALIDA ==> " + salida.toString()); // cerramos transacción <OPCIONAL> session.getTransaction().commit(); System.out.println("FIN"); } private static SessionFactory buildSessionFactory() { try { Configuration configuration = new Configuration(); configuration.configure("hibernate.cfg.xml"); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() .applySettings(configuration.getProperties()).build(); SessionFactory sessionFactory = configuration .buildSessionFactory(serviceRegistry); return sessionFactory; } catch (Throwable ex) { System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } }
La clave es registrar adecuadamente los parámetros, registrando su tipo de dato y Mode el cual puede ser de entrada o salida.