Saltar al contenido

¿Cómo podemos llamar a un procedimiento almacenado con Hibernate y JPA?

Después de de nuestra larga búsqueda de información dimos con la respuesta este enigma que tienen ciertos los lectores. Te compartimos la respuesta y deseamos que sea de mucha apoyo.

Solución:

Teniendo en cuenta el siguiente procedimiento almacenado que simplemente devuelve un valor de retorno básico:

CREATE OR REPLACE PROCEDURE count_comments (  
   postId IN NUMBER,  
   commentCount OUT NUMBER )  
AS 
BEGIN 
    SELECT COUNT(*) INTO commentCount  
    FROM post_comment  
    WHERE post_id = postId; 
END;

Puedes llamar a este con JPA estándar:

StoredProcedureQuery query = entityManager
    .createStoredProcedureQuery("count_comments")
    .registerStoredProcedureParameter(1, Long.class, 
        ParameterMode.IN)
    .registerStoredProcedureParameter(2, Long.class, 
        ParameterMode.OUT)
    .setParameter(1, 1L);

query.execute();

Long commentCount = (Long) query.getOutputParameterValue(2);

Si el procedimiento almacenado devuelve un SYS_REFCURSOR:

CREATE OR REPLACE PROCEDURE post_comments ( 
   postId IN NUMBER, 
   postComments OUT SYS_REFCURSOR ) 
AS 
BEGIN
    OPEN postComments FOR
    SELECT *
    FROM post_comment 
    WHERE post_id = postId; 
END;

Puedes llamarlo así:

StoredProcedureQuery query = entityManager
    .createStoredProcedureQuery("post_comments")
    .registerStoredProcedureParameter(1, Long.class, 
         ParameterMode.IN)
    .registerStoredProcedureParameter(2, Class.class, 
         ParameterMode.REF_CURSOR)
    .setParameter(1, 1L);

query.execute();

List postComments = query.getResultList();

Si desea llamar a una función de base de datos de Oracle:

CREATE OR REPLACE FUNCTION fn_count_comments ( 
    postId IN NUMBER ) 
    RETURN NUMBER 
IS
    commentCount NUMBER; 
BEGIN
    SELECT COUNT(*) INTO commentCount 
    FROM post_comment 
    WHERE post_id = postId; 
    RETURN( commentCount ); 
END;

no puedes usar el StoredProcedureQuery ya que no funciona con Hibernate 5, entonces puedes llamarlo así:

BigDecimal commentCount = (BigDecimal) entityManager
    .createNativeQuery(
        "SELECT fn_count_comments(:postId) FROM DUAL"
    )
    .setParameter("postId", 1L)
    .getSingleResult();

o con JDBC simple:

Session session = entityManager.unwrap( Session.class ); 

Integer commentCount = session.doReturningWork( connection -> 
    try (CallableStatement function = connection.prepareCall(
            " ? = call fn_count_comments(?) " )) 
        function.registerOutParameter( 1, Types.INTEGER );
        function.setInt( 2, 1 );
        function.execute();
        return function.getInt( 1 );
    
 );

Para más detalles consulta los siguientes artículos:

  • Cómo llamar a funciones y procedimientos almacenados de Oracle con JPA e Hibernate
  • Cómo llamar a funciones y procedimientos almacenados de SQL Server con JPA e Hibernate
  • Cómo llamar a funciones de PostgreSQL (procedimientos almacenados) con JPA e Hibernate
  • Cómo llamar a funciones y procedimientos almacenados de MySQL con JPA e Hibernate

Puedes hacer lo siguiente

 Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
PreparedStatement st = session.connection().prepareStatement("call procedureName(?, ?)");
                st.setString(1, formatter.format(parameter1));
                st.setString(2, formatter.format(parameter2));
                st.execute();
tx.commit();

Agregue el manejo de excepciones donde sea necesario.

Para ejecutar el procedimiento remoto use esta construcción:

Cartografía

   
    call some_rp(:param1, :param2)

codigo Java

session.getNamedQuery("RP").setInteger("param1", 1).setInteger("param2", 2).executeUpdate();

Si crees que te ha sido de ayuda este artículo, nos gustaría que lo compartas con otros programadores de esta forma contrubuyes a extender nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *