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异常:
请告诉我在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 ); 作为一个额外的好处,人们尽早尝试这一点可以帮助塑造它在发布之前的样子(此时它更难改变). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |