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 に答える