簡體   English   中英

無法使用Hibernate 5.0.8執行存儲過程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM