微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 如何在Hibernate中调用存储过程?

我在Oracle数据库中有一个存储过程.
GET_vendOR_STATUS_COUNT(DOCUMENT_ID IN NUMBER,NOT_INVITED OUT NUMBER,INVITE_WITHDRAWN OUT NUMBER,...

其他参数是OUT参数.

在我的hbm文件中,我写了以下内容

<sql-query name="getvendorStatus" callable="true">
     <return-scalar column="NOT_INVITED" type="string"/>
     <return-scalar column="INVITE_WITHDRAWN" type="string"/>
     <return-scalar column="INVITED" type="string"/>
     <return-scalar column="disQUALIFIED" type="string"/>
     <return-scalar column="RESPONSE_AWAITED" type="string"/>
     <return-scalar column="RESPONSE_IN_PROGRESS" type="string"/>
     <return-scalar column="RESPONSE_RECEIVED" type="string"/>
     { call GET_vendOR_STATUS_COUNT(:DOCUMENT_ID,:NOT_INVITED,:INVITE_WITHDRAWN,:INVITED,:disQUALIFIED,:RESPONSE_AWAITED,:RESPONSE_IN_PROGRESS,:RESPONSE_RECEIVED ) }
</sql-query>

这是我的Java代码

session.getNamedQuery("getvendorStatus").setParameter("DOCUMENT_ID","DOCUMENT_ID").setParameter("NOT_INVITED","NOT_INVITED")

……继续直到所有参数.

我收到以下sql异常:

18:29:33,056 WARN [JDBCExceptionReporter] sql Error: 1006,sqlState:
72000
18:29:33,056 ERROR [JDBCExceptionReporter] ORA-01006: bind
variable does not exist

请告诉我在Hibernate中调用存储过程的确切过程是什么?我不想使用JDBC可调用语句.

解决方法

4.1中不支持您正在尝试的内容(INOUT / OUT参数处理).通过4.1 Hibernate的可调用语句支持侧重于ResultSet返回.支持您在上游主服务器上已经尝试的内容,并且将成为Hibernate的下一个主要版本(将是4.2或5.0)的一部分;在那里,调用函数/过程现在是一流的操作.

目前,您必须直接使用JDBC或从master构建Hibernate并使用该新支持.如果你选择后者,它看起来像:

StoredProcedureCall call = session.createStoredProcedureCall( "GET_vendOR_STATUS_COUNT" )
        .registerStoredProcedureParameter( "DOCUMENT_ID",Long.class,ParameterMode.IN )
        .registerStoredProcedureParameter( "NOT_INVITED",String.class,ParameterMode.OUT )
        ...;
call.getRegisteredParameter( "DOCUMENT_ID" ).bindValue( theDocumentId );
StoredProcedureOutputs outputs = call.getoutputs();
String notinvited = (String) outputs.getoutputParameterValue( "NOT_INVITED" );
...

代码仍然很年轻,可能会改变.例如,当我更频繁地编写这些示例时,我认为registerStoredProcedureParameter应该重命名为registerParameter或declareParameter,并且它应该返回声明/注册的类型表示;就像是:

interface RegisteredParameter<T> {
    Class<T> getParameterType();
    // only valid for IN or INOUT params
    void bindValue(T value);
}

<T> RegisteredParameter<T> registerParameter(String name,Class<T> type,ParameterMode mode);

然后允许:

StoredProcedureCall call = session.createStoredProcedureCall( "GET_vendOR_STATUS_COUNT" )
call.registerParameter( "DOCUMENT_ID",ParameterMode.IN ).bindValue( theDocumentId );
RegisteredParameter<String> notinvitedParam = call.registerParameter( "NOT_INVITED",ParameterMode.OUT );
...
String notinvited = outputs.getoutputParameterValue( notinvitedParam );

作为一个额外的好处,人们尽早尝试这一点可以帮助塑造它在发布之前的样子(此时它更难改变).

原文地址:https://www.jb51.cc/java/129620.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐