我遇到了在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
有人可以帮助解决错误的地方吗?
答案 0 :(得分:0)
我认为你没有正确使用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
}
}