[英]How to Call Oracle Stored Procedure using Hibernate?
下面是我的 Oracle 存儲過程,
create or replace
PROCEDURE "REPORT_HIBERNATE"(
start_year IN NUMBER,
output_data OUT SYS_REFCURSOR
)
AS
BEGIN
DECLARE
select_query LONG;
BEGIN
select_query :='SELECT
GLOBAL_ID,
PROJECT_NUMBER,
FISCAL_YEAR,
FISCAL_MONTH,
WEEK_END_DATE,
ACTIVITY,
COST_CENTER,
ACTUAL_HOURS,
APPROVED_HOURS,
NORMALIZED_HOURS
FROM TS_TBTIMECARD_WEEKLY_DATA
where FISCAL_YEAR in
(SELECT FISCAL_YEAR
FROM TS_TBTIMECARD_WEEKLY_DATA
where FISCAL_YEAR = ' ||start_year|| '
)';
OPEN output_data FOR select_query;
END;
END REPORT_HIBERNATE;
下面是實體類:
@Entity
@SequenceGenerator(name="wkseq", initialValue=1, allocationSize=1)
@Table(name = "TS_TBTIMECARD_WEEKLY_DATA")
@NamedNativeQuery(name = "call_REPORT_HIBERNATE_procedure",
query = "{ CALL REPORT_HIBERNATE(:start_year) }",
resultClass = TimecardWeeklyData.class, hints = {
@javax.persistence.QueryHint(name = "org.hibernate.callable", value = "true") })
public class TimecardWeeklyData {
...
}
DAOImpl:
Query query = sessionFactory.getCurrentSession().getNamedQuery("call_REPORT_HIBERNATE_procedure");
query.setParameter("start_year",2014);
List result = query.list();
我得到以下異常:Hibernate: { CALL REPORT_HIBERNATE(?) } org.hibernate.exception.GenericJDBCException: could not execute query ... and Caused by: java.sql.SQLException: Invalid column index
請讓我知道如何在 Spring 中使用 Hibernate Annotation 調用這個存儲過程?
考慮到您有一個SYS_REFCURSOR
OUT 參數:
CREATE OR REPLACE PROCEDURE post_comments (
postId IN NUMBER,
postComments OUT SYS_REFCURSOR )
AS
BEGIN
OPEN postComments FOR
SELECT *
FROM post_comment
WHERE post_id = postId;
END;
您可以像這樣調用存儲過程:
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("post_comments")
.registerStoredProcedureParameter(1, Long.class,
ParameterMode.IN)
.registerStoredProcedureParameter(2, Class.class,
ParameterMode.REF_CURSOR)
.setParameter(1, 1L);
query.execute();
List<Object[]> postComments = query.getResultList();
您的OUT
參數不是第一個。 如果您能夠修改您的過程,請重新排列參數以使OUT
參數成為第一個參數,然后在您的@NamedNativeQuery
注釋中對其進行說明。
query = "{ CALL REPORT_HIBERNATE(?, :start_year) }",
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.