0

我需要得到存储过程执行的结果,假设我正在使用这个接口: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) { ... }
4

1 回答 1

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 只是个人选择。

我会建议最适合您正在从事的项目的方法。

于 2012-12-27T16:45:56.593 回答