Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate JPA 2.1:OUT REF光标处于非第一个位置?_Java_Oracle_Hibernate_Jpa_Stored Procedures - Fatal编程技术网

Java Hibernate JPA 2.1:OUT REF光标处于非第一个位置?

Java Hibernate JPA 2.1:OUT REF光标处于非第一个位置?,java,oracle,hibernate,jpa,stored-procedures,Java,Oracle,Hibernate,Jpa,Stored Procedures,我正在使用一个遗留的Oracle数据库,其中所有存储过程都是使用OUT参数last定义的。Hibernate只支持先定义OUT参数的存储过程 使用Hibernate ORM 4.3.5,是否有方法覆盖Hibernate的Oracle驱动程序,使用最后一个参数而不是第一个参数从@namedNativeRequesty获取值?我已经开始使用CallableStatement,但这违背了使用Hibernate和JPA的全部目的 以下是我试图定义我的@namednaviequity的方法,如果可能的话,

我正在使用一个遗留的Oracle数据库,其中所有存储过程都是使用OUT参数last定义的。Hibernate只支持先定义OUT参数的存储过程

使用Hibernate ORM 4.3.5,是否有方法覆盖Hibernate的Oracle驱动程序,使用最后一个参数而不是第一个参数从
@namedNativeRequesty
获取值?我已经开始使用
CallableStatement
,但这违背了使用Hibernate和JPA的全部目的

以下是我试图定义我的
@namednaviequity
的方法,如果可能的话,我希望坚持这个定义:

@NamedNativeQuery(
    name = "MyEntity.storedProc",
    query = "call ENTITY_PKG.StoredProc(:inputOne, :inputTwo, :resultSet)",
    callable = true,
    readOnly = true,
    resultClass = MyEntity.class
)

更新:

在跟进Neil Stockton的回答后,我提出了以下
@NamedStoredProcedureQuery
注释:

@NamedStoredProcedureQuery(
        name = "MyEntity.storedProc",
        procedureName = "ENTITY_PKG.StoredProc",
        resultClasses = MyEntity.class,
        parameters = {
            @StoredProcedureParameter(name = "I_INPUT_ONE", type = String.class, mode = ParameterMode.IN),
            @StoredProcedureParameter(name = "I_INPUT_TWO", type = Character.class, mode = ParameterMode.IN),
            @StoredProcedureParameter(name = "O_CURSOR", type = void.class, mode = ParameterMode.REF_CURSOR)
        }
)
但是,在此异常中使用上述结果
java.lang.UnsupportedOperationException:org.hibernate.dialent.Oracle10gDialent不支持通过存储过程生成的结果集
。以下是堆栈跟踪:

Caused by: java.lang.UnsupportedOperationException: org.hibernate.dialect.Oracle10gDialect does not support resultsets via stored procedures
    at org.hibernate.dialect.Dialect.registerResultSetOutParameter(Dialect.java:1612)
    at org.hibernate.engine.jdbc.cursor.internal.StandardRefCursorSupport.registerRefCursorParameter(StandardRefCursorSupport.java:94)
    at org.hibernate.procedure.internal.AbstractParameterRegistrationImpl.prepare(AbstractParameterRegistrationImpl.java:298)
    at org.hibernate.procedure.internal.ProcedureCallImpl.buildOutputs(ProcedureCallImpl.java:417)
    at org.hibernate.procedure.internal.ProcedureCallImpl.getOutputs(ProcedureCallImpl.java:378)
    at org.hibernate.jpa.internal.StoredProcedureQueryImpl.outputs(StoredProcedureQueryImpl.java:251)
    at org.hibernate.jpa.internal.StoredProcedureQueryImpl.execute(StoredProcedureQueryImpl.java:234)
    at com.example.MyEntityDao.testStoredProc(MyEntityDao.java:88)
当我尝试执行以下查询时会发生这种情况:

StoredProcedureQuery query = entityManager
        .createNamedStoredProcedureQuery("MyEntity.storedProc");

query.setParameter("I_INPUT_ONE", "inputOneValue");
query.setParameter("I_INPUT_TWO", 'x');
query.execute(); // exception is triggered by query.execute()

MyEntity myEntity = (MyEntity) query.getOutputParameterValue("O_CURSOR");
这本身没有多大意义,因为
Oracle10gDialante
确实继承了
registerResultSetOutParameter()
的实现。此方法是通过
Oracle8iDialect
覆盖
@Override
n,它是
Oracle9iDialect
的超类,而Oracle9iDialect又是
oracle10galent
的超类

我的Hibernate方言在
persistence.xml
部分中定义:

<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />

我做错了什么?

JPA2.1提供了一个API来使用存储过程,而不是将它们作为本机“查询”进行黑客攻击。也许您真的应该使用它?

Oracle不直接支持返回ResultSet的存储过程,但有一个解决方法。参考资料。HTHUsing JPA 2.1、Hibernate 5.0.9、Oracle10gDialogue-我无法让存储过程API使用命名参数和至少一个OUT参数。位置似乎没问题,但只是把警告放在那里。也许你应该添加你自己的问题和问题的细节,因为这是针对其他人的。我尝试使用StoredProcedurery,但得到相同的异常,所以问题不是使用JPA 2.1
CREATE OR REPLACE PACKAGE ENTITY_PKG IS
TYPE EntityCursor IS REF CURSOR;

PROCEDURE StoredProc
(
   I_INPUT_ONE IN ENTITIES.INPUT_ONE%TYPE, -- VARCHAR2
   I_INPUT_TWO IN ENTITIES.INPUT_TWO%TYPE, -- CHAR
   O_CURSOR OUT EntityCursor 
);

END ENTITY_PKG;