【问题标题】:How to Call Oracle Stored Procedure using Hibernate?如何使用 Hibernate 调用 Oracle 存储过程?
【发布时间】:2014-02-21 12:17:55
【问题描述】:

下面是我的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();

我得到以下异常: 休眠:{ CALL REPORT_HIBERNATE(?) } org.hibernate.exception.GenericJDBCException: 无法执行查询 ... 和 原因:java.sql.SQLException: Invalid column index

请告诉我如何在 Spring 中使用 Hibernate Annotation 调用此存储过程??

【问题讨论】:

    标签: java spring oracle hibernate


    【解决方案1】:

    考虑到你有一个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();
    

    【讨论】:

    • 如何映射query.getResultList()的结果;自定义类/Dto?
    • 我有一个 oracle 存储过程,可以使用光标作为输出参数来获取数据,StoredProcedureQuery query = entityManager .createStoredProcedureQuery("getStudent").registerStoredProcedureParameter(1, Class.class, ParameterMode.REF_CURSOR) 我可以获得结果,但无法将其转换为我的学生 pojo 类,卡在了这个过去 1 天的最后一步
    【解决方案2】:

    您的OUT 参数不是第一个。如果您能够修改您的过程,请重新排列参数以使 OUT 参数成为第一个参数,然后在您的 @NamedNativeQuery 注释中说明它。

    query = "{ CALL REPORT_HIBERNATE(?, :start_year) }",
    

    【讨论】:

      猜你喜欢
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2011-06-11
      • 2012-12-30
      • 1970-01-01
      相关资源
      最近更新 更多