当前位置: 首页 > 知识库问答 >
问题:

Hibernate存储过程调用导致GenericJDBcException:无效的列索引

戚学文
2023-03-14

为了使用Oracle存储过程学习Hibernate4.1,我尝试使用一个尽可能简单的示例:1。%2中没有传递参数。SYS_REFCURSOR作为一个返回参数

我得到的是一个异常:“org.hibernate.exception.GenericJDBcException:无效列索引”。在网上搜索几个小时来解决这个问题并没有什么帮助。

CREATE OR REPLACE PROCEDURE IFC_OWNER.JPA_APPLICATION_R_TEST 
(    o_result_set OUT SYS_REFCURSOR  )
AS
BEGIN
    OPEN o_result_set FOR
    SELECT APPLICATION_ID, APP_COMMON_NM, APP_DESC, APP_URL FROM APPLICATION_R;
END;
/
<sql-query name="oracleproccall" callable="true">
    <return alias="application_r" class="com.myco.entities.ApplicationR"/>
    <![CDATA[ call JPA_APPLICATION_R_TEST() ]]>
</sql-query>
public void run() {
EntityManager entityManager = entityManagerFactory.createEntityManager();
try {
    Query sqlQuery = entityManager.createNamedQuery("oracleproccall");
    List list = sqlQuery.getResultList();    
    ...snip...
} catch (PersistenceException ex) {
    ex.printStackTrace();
} finally {
    entityManager.close();
}    
}
    @Entity
    @Table(name = "APPLICATION_R", schema = "IFC_OWNER")
    public class ApplicationR implements Serializable {
        private int applicationId;
        private String appCommonNm;
        private String appDesc;
        private String appUrl;
        ...snip...
More available if needed. 

================================异常

## ApplicationsByStoredProc ##
Hibernate: 
    /* named native SQL query oracleproccall */ call JPA_APPLICATION_R_TEST()
Feb 19, 2013 2:58:07 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 17003, SQLState: 99999
Feb 19, 2013 2:58:07 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Invalid column index
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Invalid column index
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1377)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1300)
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:266)
    at com.myco.jpa.tests.ApplicationsByStoredProc.run(ApplicationsByStoredProc.java:37)
    at com.dstoutput.jpa.JPAEntities_InFactDomain_Test.main(JPAEntities_InFactDomain_Test.java:56)
Caused by: org.hibernate.exception.GenericJDBCException: Invalid column index
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
    at org.hibernate.engine.jdbc.internal.proxy.CallableStatementProxyHandler.continueInvocation(CallableStatementProxyHandler.java:49)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
    at $Proxy16.registerOutParameter(Unknown Source)
    at org.hibernate.dialect.Oracle8iDialect.registerResultSetOutParameter(Oracle8iDialect.java:507)

共有1个答案

易宣
2023-03-14

我找到问题了。我使用的是会话和查询类的javax.persistence版本,而不是org.hibernate版本;javax.persistence不支持Oracle存储过程调用,而Hibernate支持。如果没有下面提供的import语句,差异是微妙的。应该使用sqlquery.getResultList()。这是一个JPA方法调用,在Hibernate版本的Query中不存在。

导入导入javax.persistence.query;

查询sqlQuery=EntityManager.createNamedQuery(“OracleProcCall”);List List=sqlquery.getResultList();

import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.myco.entities.ApplicationR


private void anotherTest() {
    Configuration cfg = new Configuration();
    cfg.configure("hibernate.cfg.xml");
    SessionFactory sf = cfg.buildSessionFactory();
    Session s = sf.openSession();
    Transaction tx = s.beginTransaction();

    List<AppR> apps;
    Query namedQuery = s.getNamedQuery("oraclestoredproc");
    apps = namedQuery.list();
    apps = s.getNamedQuery("oraclestoredproc").list();
    Iterator<ApplicationR> iterator = apps.iterator();
    while (iterator.hasNext()) {
        ApplicationR app = (ApplicationR) iterator.next();
        System.out.print(app.getApplicationId() + " ");
        System.out.print(app.getAppCommonNm() + " ");
        System.out.print(app.getAppDesc() + " ");
        System.out.println(app.getAppUrl() + " ");
    }
    s.flush();
    tx.commit();
    s.close();
}

感谢吉图吉,也感谢这个来源

 类似资料:
  • 问题内容: 是否可以在另一个存储过程中使用一个存储过程的结果? IE 我尝试使用,但无法在嵌套语句中调用。 有什么办法可以做到这一点?环境是SQL Server 2008。 问题答案: 您最多可以嵌套32个级别的存储过程。 我建议阅读这篇有关INSERT- EXEC的文章。这是一个摘录: 如果some_sp尝试使用INSERT-EXEC调用some_other_sp,您将收到一条错误消息。因此,一

  • 我有一个在包中定义的存储过程。该过程接受两个参数,一个是游标: 我是这样调用这个过程的: 它将返回以下错误: 你好,阿尼尔班。

  • 尝试调用MSSQL存储过程。过程基本上是这样的:使用[DATABASE]GO SET ANSI _ NULLS ON GO SET QUOTED _ IDENTIFIER ON GO 更改过程。[stored procedure](@ username varchar(10))as 从表名中选择用户名 输出是:array(0) { }这个数据库中有大量的数据。 我知道与数据库的连接是有效的,但当我

  • 问题内容: PostgreSQL 11现在支持存储过程,我正在尝试使用 Hibernate 5.3.7.Final 和 Postgresql 42.2.5 JDBC驱动程序 进行调用。在PostgreSQL 11之前,我们有可以用JPA调用的函数。但是,函数是通过执行的,而新的存储过程必须以 我正在尝试执行以下简单的存储过程: JPA批注如下所示: 我用以下方法调用存储过程: 我的日志如下所示:

  • 问题内容: 昨晚我刚刚开始学习hibernate,它相当有趣。我在使用hibernate将存储过程作为sql查询调用时遇到麻烦。我已附上来源和错误,请帮助我。谢谢 :) 这是Java文件::: 错误是::: 问题答案: 我基本上不使用hibernate的getNamedQuery重新设计输入,但是java.sql类可以正常工作!

  • 我有一个基于spring的java web应用程序,它使用HSQLDB dbms后端在事务中插入大量记录。为了减少为要插入的记录生成主键的往返次数,我想创建一个存储过程,生成主键,在插入之前将其用作标识符。因此,我用以下代码创建了一个存储过程: 有一个序列GENERATE_PKS_SEQ,用于为要插入的记录生成唯一标识符。此存储过程需要一个数字输入(NUMBEROFIDS)来定义要生成的密钥数。