Reputation: 1509
I want to call a Stored Procedure from Hibernate which returns an out value. Here is my Stored Procedure.
create procedure myProcedure
(
in in_Id int,
out out_Id int
)
begin
...
END;
I am trying this to call my procedure
Query query = session.createSQLQuery(
"CALL myProcedure(:in_Id)")
.setParameter("in_id", 123);
//Not sure how to register out parameters...??
List result = query.list();
I tried everything but no luck. Can you help me please? If i try the above it says:
Incorrect number of arguments for PROCEDURE myProcedure; expected 2, got 1
I tried to add an out parameter like
myProcedure(:out_id:in_Id)
but then it says
Not all named parameters have been set:
I don't know how out parameter will be set? Is it like the following?
.setParameter("out_id", ?);
Any help is appreciated :)
Upvotes: 15
Views: 57339
Reputation: 154130
Considering you have a simple stored procedure that outputs a basic type:
CREATE PROCEDURE count_comments (
IN postId INT,
OUT commentCount INT
)
BEGIN
SELECT COUNT(*) INTO commentCount
FROM post_comment
WHERE post_comment.post_id = postId;
END
You can call this stored procedure using a JPA StoredProcedureQuery
:
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("count_comments")
.registerStoredProcedureParameter("postId", Long.class, ParameterMode.IN)
.registerStoredProcedureParameter("commentCount", Long.class, ParameterMode.OUT)
.setParameter("postId", 1L);
query.execute();
Long commentCount = (Long) query
.getOutputParameterValue("commentCount");
Upvotes: 11
Reputation: 1
example:
Session session = em.unwrap(Session.class);
session.setHibernateFlushMode(FlushMode.MANUAL);
ProcedureCall query = session.createStoredProcedureCall("dbo.sp_getorderlistbyparam",BasicResult.class);
query.registerParameter("search_text",String.class, ParameterMode.IN).bindValue(searchText);
query.registerParameter("membership_nbr",String.class,
query.registerParameter("is_debug",Integer.class, ParameterMode.IN).bindValue(0);
query.registerParameter("result_count",Integer.class, ParameterMode.OUT);
basicResults = (List<BasicResult>) query.getResultList();
ProcedureOutputs procedureOutputs = query.getOutputs();
parameterMap.put("totalOrderCnt" ,(Integer) procedureOutputs.getOutputParameterValue("result_count"));
Upvotes: 0
Reputation: 56
@PersistenceContext
private EntityManager entitymanager;
@Override
public String function(int id, int emp_id, String letype, String days, Date fromdate, Date todate, String reason,
String backup, int user_id) {
//Session session = entitymanager.unwrap(Session.class);
StoredProcedureQuery applyLeave = entitymanager.createStoredProcedureQuery("sp_apply_leave");
applyLeave.registerStoredProcedureParameter("p_id", Integer.class, ParameterMode.IN)
.registerStoredProcedureParameter("p_emp_id", Integer.class, ParameterMode.IN)
.registerStoredProcedureParameter("p_letype", String.class, ParameterMode.IN)
.registerStoredProcedureParameter("p_days", String.class, ParameterMode.IN)
.registerStoredProcedureParameter("p_fmdate", Date.class, ParameterMode.IN)
.registerStoredProcedureParameter("p_todate", Date.class, ParameterMode.IN)
.registerStoredProcedureParameter("p_reason", String.class, ParameterMode.IN)
.registerStoredProcedureParameter("p_backper", String.class, ParameterMode.IN)
.registerStoredProcedureParameter("p_user_id", Integer.class, ParameterMode.IN)
.registerStoredProcedureParameter("error_msg", String.class, ParameterMode.INOUT);
applyLeave.setParameter("p_id", id);
applyLeave.setParameter("p_emp_id" , emp_id);
applyLeave.setParameter("p_letype" , letype);
applyLeave.setParameter("p_days" , days);
applyLeave.setParameter("p_fmdate" , fromdate);
applyLeave.setParameter("p_todate" , todate);
applyLeave.setParameter("p_reason" , reason);
applyLeave.setParameter("p_backper" , backup);
applyLeave.setParameter("p_user_id" , user_id);
applyLeave.setParameter("error_msg", new String("error_msg"));
//applyLeave.executeUpdate();
String error_msg = (String) applyLeave.getOutputParameterValue("error_msg");
return error_msg;
}
here i have autowired entitymanager and configured hibernate Persistence in config package
Upvotes: 0
Reputation: 131
just cal normal way but store response out param
in Object[] and we can also get multiple response value in Onject[]
Object[] respnseCode = (Object[])session.createSQLQuery(
"CALL myProcedure_only_in_parms (:in_Id)")
.setParameter("in_id", 123);
List result = query.list();
sysout("out_Id"+respnseCode[0]);
Upvotes: -1
Reputation: 1669
@Override
public String generateVoucherNumber(ExpenseHeaderDTO expenseHeaderDTO) {
Session session = sessionFactory.getCurrentSession();
ProcedureCall query = session.createStoredProcedureCall("voucher_number");
query.registerParameter(
"module", String.class, ParameterMode.IN).bindValue("EMPLOYEE_EXPENSE");
query.registerParameter(
"voucherNumber", String.class, ParameterMode.OUT);
ProcedureOutputs procedureResult=query.getOutputs();
String voucherNumber= (String) procedureResult.getOutputParameterValue("voucherNumber");
return voucherNumber;
}
Refer above example
Upvotes: -1
Reputation: 1
ResultSet rs1=null;
ArrayList<Lookup_master> list=new ArrayList<Lookup_master>();
CallableStatement cStmt;
try {
cStmt = hibernateConfiguration.dataSource().getConnection()
.prepareCall("{call SP_ADVSER_LOOKUPMASTER(?,?,?,?,?,?,?)}");
cStmt.setString(1,lookup_master.getLookup_code());
cStmt.setString(2,lookup_master.getLookup_type());
cStmt.setString(3,lookup_master.getLookup_name());
cStmt.setString(4,lookup_master.getMeaning());
cStmt.setString(5,request.getParameter("start_date"));
cStmt.setString(6,request.getParameter("end_date"));
cStmt.registerOutParameter(7, OracleTypes.CURSOR);
cStmt.executeQuery();
rs1 = (ResultSet) cStmt.getObject(7);
while (rs1.next()) {
Lookup_master lookup_master1=new Lookup_master();
lookup_master1.setLookup_id(rs1.getInt(1));
lookup_master1.setLookup_code(rs1.getString(2));
lookup_master1.setLookup_type(rs1.getString(3));
lookup_master1.setLookup_name(rs1.getString(4));
lookup_master1.setMeaning(rs1.getString(5));
lookup_master1.setStart_date(rs1.getDate(6));
lookup_master1.setEnd_date(rs1.getDate(7));
list.add(lookup_master1);
System.out.println(lookup_master1.getLookup_id());
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
Upvotes: -3
Reputation: 4213
The easiest way to do that is return the out parameter as part of the returning parameters
(relevant only if you have access to the store procedures).
jest add a store procedure like the following one
create procedure myProcedure_only_in_parms (
in in_Id int)
begin
call myProcedure(in_id,@out_Id) ;
select @out_id
END;
after done that it quite simple to use it with Hibernet in the following way
Query query = session.createSQLQuery(
"CALL myProcedure_only_in_parms (:in_Id)")
.setParameter("in_id", 123);
List result = query.list();
The result contains the out parameter,
if you want return multiply parameters you can add it by doing
select @parm1,@parm2,... ,@parmn
Hope it helped
Upvotes: 7