[英]Unable to Execute Stored Procedure using Hibernate 5.0.8
我遇到了在hibernate(5.0.8)中執行存儲過程的問題。 以下是相同的代碼......
MyDao.java
@SuppressWarnings("unchecked")
public List getList() {
ProcedureCall procedureCall = getSessionFactory()
.getCurrentSession()
.createStoredProcedureCall(
"mysp_get_stored_proc",
MyClass.class);
procedureCall.registerParameter("p_code_category",String.class, ParameterMode.IN).bindValue("WORLD");
procedureCall.registerParameter("p_cdt_language", String.class, ParameterMode.IN).bindValue("FRENCH");
procedureCall.registerParameter("p_lst", Class.class, ParameterMode.REF_CURSOR);
procedureCall.registerParameter("p_err_code_out", Integer.class, ParameterMode.OUT);
procedureCall.registerParameter("p_err_msg_out", String.class, ParameterMode.OUT);
ProcedureOutputs procedureOutputs = procedureCall.getOutputs();
ResultSetOutput resultSetOutput = (ResultSetOutput) procedureOutputs.getCurrent();
List list = resultSetOutput.getResultList();
return list;
}
我的存儲過程簽名:
PROCEDURE mysp_get_stored_proc (
p_code_category IN code_table.code_cat_cd%TYPE,
p_cdt_language IN object_intr.ct_language_cd%TYPE,
p_lst OUT ref_cur,
p_err_code_out OUT NUMBER,
p_err_msg_out OUT VARCHAR2
)
錯誤信息 :
java.sql.SQLException: The number of parameter names does not match the number of registered praremeters
at oracle.jdbc.driver.OracleSql.setNamedParameters(OracleSql.java:198)
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4712)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1376)
at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.pmiExecute(WSJdbcPreparedStatement.java:958)
at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.execute(WSJdbcPre
有人可以幫助解決錯誤的地方嗎?
我認為你沒有正確使用ref_cursor。 下面是如何使用ref_cursor的示例。
CREATE OR REPLACE FUNCTION get_reviews(bookid bigint)
RETURNS refcursor AS
$BODY$
DECLARE
reviews refcursor; -- Declare cursor variables
BEGIN
OPEN reviews FOR SELECT id, comment, rating, version, book_id FROM review WHERE book_id = bookId;
RETURN reviews;
END;
$BODY$
LANGUAGE plpgsql
命名過程查詢:
@NamedStoredProcedureQuery(
name = "getReviews",
procedureName = "get_reviews",
resultClasses = Review.class,
parameters = {
@StoredProcedureParameter(mode = ParameterMode.REF_CURSOR, type = void.class),
@StoredProcedureParameter(mode = ParameterMode.IN, type = Long.class)
}
)
這就是你如何使用查詢:
List<Book> books = (List<Book>) this.em.createNamedStoredProcedureQuery("getBooks").getResultList();
for (Book b : books) {
StoredProcedureQuery q = this.em.createNamedStoredProcedureQuery("getReviews");
q.setParameter(2, b.getId());
List<Review> reviews = q.getResultList();
for (Review r : reviews) {
// do something
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.