无法使用Hibernate 5.0.8执行存储过程

时间:2016-10-10 14:40:13

标签: hibernate

我遇到了在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

有人可以帮助解决错误的地方吗?

1 个答案:

答案 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
}
}