我需要获取存储过程执行的结果,假设我正在使用这个接口:org.hibernate.SQLQuery。
目前代码如下:
SQLQuery query = s.createSQLQuery("exec myProc :list, :out);
query.setString("list", list);
query.setInteger("out", out);
try {
query.executeUpdate();
} catch (HibernateException e) { ... }
如果我将其更改为: - 它会起作用吗?
SQLQuery query = s.createSQLQuery("DECLARE @totalRes INT ; exec myProc
:list, @myInnerParam=@totalRes OUTPUT; select @totalRes");
query.setString("list", list);query.setInteger("out", out); try {
Object result = query.uniqueResult(); } catch (HibernateException e) { ... }
答案 0 :(得分:1)
以下是Hibernate的存储过程示例。
我没有使用这里建议的所有技术,但我通常使用NamedQuery方法
存储过程:(这将根据底层数据库而改变)
ALTER PROCEDURE [dbo].[CL_ServiceHoursImport]
@orderId int = 0
AS
select Id, Name from OrderProducts where OrderId = @orderId;
定义命名查询(您可以通过不同的方式定义它)
<sql-query name="myProcNamedQuery">
<return alias="output" class="com.stackoverflow.StoredProcedureOutput"/>
<![CDATA[exec GetStocks :orderId]]>
</sql-query>
输出类
public class StoredProcedureOutput{
private int Id;
private String Name;
@Override
public String toString(){
return Id + " " + Name + "\n";
}
// getter setters
}
调用NamedQuery:(取自博文中的示例)
Query query = session.getNamedQuery("myProcNamedQuery")
.setParameter("orderId", orderId);
for(int i=0; i<result.size(); i++){
StoredProcedureOutput output = (StoredProcedureOutput)result.get(i);
System.out.println(output);
}
<强>更新强>
使用NamedQuery只是个人选择。
我建议最适合您正在进行的项目的方法。