[英]How to call a MySQL stored procedure with multiple OUT parameters using JPA and Hibernate?
[英]How to call a Stored Procedure from Hibernate having both IN and OUT parameters
我想從 Hibernate 調用一個存儲過程,它返回一個輸出值。 這是我的存儲過程。
create procedure myProcedure
(
in in_Id int,
out out_Id int
)
begin
...
END;
我正在嘗試調用我的程序
Query query = session.createSQLQuery(
"CALL myProcedure(:in_Id)")
.setParameter("in_id", 123);
//Not sure how to register out parameters...??
List result = query.list();
我嘗試了一切,但沒有運氣。 你能幫我嗎? 如果我嘗試上述操作,它會說:
PROCEDURE myProcedure 的參數數量不正確; 預期 2,得到 1
我試圖添加一個輸出參數,如
myProcedure(:out_id:in_Id)
但它說
並非所有命名參數都已設置:
不知道out參數怎么設置? 是不是像下面這樣?
.setParameter("out_id", ?);
任何幫助表示贊賞:)
考慮到您有一個輸出基本類型的簡單存儲過程:
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
您可以使用 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");
最簡單的方法是將 out 參數作為返回參數的一部分返回(僅當您有權訪問存儲過程時才相關)。
開玩笑添加一個像下面這樣的存儲過程
create procedure myProcedure_only_in_parms (
in in_Id int)
begin
call myProcedure(in_id,@out_Id) ;
select @out_id
END;
完成后,通過以下方式將它與 Hibernet 一起使用非常簡單
Query query = session.createSQLQuery(
"CALL myProcedure_only_in_parms (:in_Id)")
.setParameter("in_id", 123);
List result = query.list();
結果包含輸出參數,如果你想返回乘法參數,你可以通過執行 select @parm1,@parm2,... ,@parmn 來添加它
希望有幫助
例子:
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"));
@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;
}
在這里,我在配置包中自動連接了 entitymanager 並配置了 hibernate Persistence
@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;
}
參考上面的例子
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]);
結果集 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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.