Aks*_*hay 7 java oracle stored-procedures hibernate
我在Oracle数据库中有一个存储过程.
GET_VENDOR_STATUS_COUNT(DOCUMENT_ID IN NUMBER, NOT_INVITED OUT NUMBER, INVITE_WITHDRAWN OUT NUMBER, ...
Run Code Online (Sandbox Code Playgroud)
其他参数是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>
Run Code Online (Sandbox Code Playgroud)
这是我的Java代码:
session.getNamedQuery("getVendorStatus").setParameter("DOCUMENT_ID", "DOCUMENT_ID").setParameter("NOT_INVITED", "NOT_INVITED")
Run Code Online (Sandbox Code Playgroud)
......继续直到所有参数.
我收到以下SQL异常:
18:29:33,056 WARN [JDBCExceptionReporter] SQL错误:1006,SQLState:72000
18:29:33,056错误[JDBCExceptionReporter] ORA-01006:绑定变量不存在
请告诉我在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" );
...
Run Code Online (Sandbox Code Playgroud)
该代码仍然很年轻,可能会改变.例如,当我更经常地写这些例子时,我认为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);
Run Code Online (Sandbox Code Playgroud)
然后允许:
StoredProcedureCall call = session.createStoredProcedureCall( "GET_VENDOR_STATUS_COUNT" )
call.registerParameter( "DOCUMENT_ID", Long.class, ParameterMode.IN ).bindValue( theDocumentId );
RegisteredParameter<String> notInvitedParam = call.registerParameter( "NOT_INVITED", String.class, ParameterMode.OUT );
...
String notInvited = outputs.getOutputParameterValue( notInvitedParam );
Run Code Online (Sandbox Code Playgroud)
作为一个额外的好处,人们尽早尝试这一点可以帮助塑造它在发布之前的样子(此时它更难改变).
使用 Hibernate,您必须应用一个结果类来将 SP 结果转换为,并且返回的列的名称必须别名为结果类中的正确返回字段。Hibernate 希望 SQLServer 存储过程有一个返回结果,并且它想知道要创建什么类型的对象。在我工作的地方,我们通常返回两列的单行结果:return_code 和 message。
例如...
return_code = 404,消息 =“找不到页面”
return_code = 200,消息 =“确定”
该类的映射与任何其他 POJO 一样,只需确保使其可序列化即可。例如:
@Entity
public class StoredProc implements Serializable {
private Integer returnCode;
private String message;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "return_code", nullable = false, unique = true)
public Integer getReturnCode() {
return returnCode;
}
public void setReturnCode(Integer returnCode) {
this.returnCode = returnCode;
}
@Column(name = "message")
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Run Code Online (Sandbox Code Playgroud)
我似乎还记得有关 Hibernate 使用的命名约定的一些普遍的虚假行为。例如,我认为names_with_underscores被翻译为camelCaseFieldNames。
归档时间: |
|
查看次数: |
21842 次 |
最近记录: |