How to call a SQL StoredProcedure from Hibernate


Oracle Stored Procedure:

CREATE OR REPLACE PROCEDURE AddNumbers(
    num1 IN NUMBER,
    num2 IN NUMBER,
    result OUT NUMBER
) AS
BEGIN
    result := num1 + num2;
END;
/

Entity Class

import javax.persistence.Entity;
import javax.persistence.NamedStoredProcedureQuery;
import javax.persistence.ParameterMode;
import javax.persistence.StoredProcedureParameter;

@Entity
@NamedStoredProcedureQuery(
    name = "AddNumbers",
    procedureName = "AddNumbers",
    parameters = {
        @StoredProcedureParameter(name = "num1", mode = ParameterMode.IN, type = Integer.class),
        @StoredProcedureParameter(name = "num2", mode = ParameterMode.IN, type = Integer.class),
        @StoredProcedureParameter(name = "result", mode = ParameterMode.OUT, type = Integer.class)
    }
)


public class Calculation {

    @Id
    private Long id;
    
    public Calculation() {
    }
    
    public Long getId() {
        return id;
    }
    
    public void setId(Long id) {
        this.id = id;
    }
}

Calling the StoredProcedure using Hibernate

package org.code2care.examples;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.procedure.ProcedureCall;

public class HibernateStoredProcedureExample {

    public static void main(String[] args) {

        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session session = sessionFactory.getCurrentSession();
        session.beginTransaction();

        try {
            ProcedureCall procedureCall = session.createStoredProcedureCall("AddNumbers");
            procedureCall.registerParameter("num1", Integer.class, ParameterMode.IN).bindValue(2);
            procedureCall.registerParameter("num2", Integer.class, ParameterMode.IN).bindValue(3);
            procedureCall.registerParameter("result", Integer.class, ParameterMode.OUT);

            procedureCall.execute();

            Integer result = (Integer) procedureCall.getOutputParameterValue("result");

            System.out.println("Result: " + result);

            session.getTransaction().commit();
        } catch (Exception e) {
            session.getTransaction().rollback();
            e.printStackTrace();
        } finally {
            session.close();
            sessionFactory.close();
        }
    }
}

Output:

Result: 5

Facing issues? Have Questions? Post them here! I am happy to answer!

Author Info:

Rakesh (He/Him) has over 14+ years of experience in Web and Application development. He is the author of insightful How-To articles for Code2care.

Follow him on: X

You can also reach out to him via e-mail: rakesh@code2care.org

Copyright © Code2care 2024 | Privacy Policy | About Us | Contact Us | Sitemap