2012-05-13 10 views
1

我很難從使用Hibernate和Java的存儲過程獲取返回值(整數)。使用Java和休眠從存儲過程獲取返回值(標量),而不是結果表

我的存儲過程如下:

create proc dbo.CheckEquipmentAuthorization 
    @ReplicaId int 
as 
    declare @IDAuthType int 
    select @IDAuthType = AuthorizationType.IDAuthorizationType from AuthorizationType 
    inner join ReplicaAuthorization on ReplicaAuthorization.RefIDAuthorizationType = AuthorizationType.IDAuthorizationType 
    inner join Replica_ReplicaAuthorization on Replica_ReplicaAuthorization.RefIDAuthorization = ReplicaAuthorization.IDAuthorization 
    inner join Replica on Replica.IDReplica = Replica_ReplicaAuthorization.RefIDReplica 
    where Replica.IDReplica = @ReplicaId 
    and GETDATE() between ReplicaAuthorization.AuthBegin and ReplicaAuthorization.AuthEnd 

    declare @AuthIntValue int 
    set @AuthIntValue = 10 
    if (@IDAuthType is not null) 
    begin 
     select @AuthIntValue = AuthorizationType.IntValue from AuthorizationType 
     where AuthorizationType.IDAuthorizationType = @IDAuthType 
    end 
    print @AuthIntValue 
    return @AuthIntValue 

我試圖用得到的返回值:

query = session.createSQLQuery(
    "exec CheckEquipmentAuthorization(:replicaId)") 
    .setParameter("replicaId", replicaId); 

但似乎我只能用這個得到一個結果表,由於沒有從我的過程中生成結果表,我也不想要一個結果表,它失敗了。

有沒有辦法使用createSQLQuery()方法得到返回值

我正在使用Hibernate,Java和SQL Server。存儲過程正常工作(我已經用sql客戶端測試過)。

謝謝。

+0

我說我下面的最終工作的解決方案,以幫助任何人有同樣的問題。 – lm2s

回答

2

這似乎是this的副本。您是否映射了存儲過程的標量返回類型?你在翻譯成那種返回類型嗎?

+0

我不相信它是重複的,我試圖得到返回的值不是結果表。我在這個問題上找不到任何東西,只能在結果表上找到。我發現的是,通常返回的值是結果表中的行數,它是我想要得到的返回值。看起來很奇怪,一件如此微不足道的事情可能很難做到。 – lm2s

+0

正確的名稱是返回碼和結果集,我想要返回碼。 (http://msdn.microsoft.com/en-us/library/aa174792(v=sql.80).aspx) – lm2s

+0

您是否定義了結果類?根據鏈接的帖子/答案,必須有一個你要返回存儲過程的類。否則,您應該只從會話工廠獲得jdbc連接並正常執行存儲過程。 –

2

在存儲過程中,我取代

return @AuthIntValue 

select @AuthIntValue as RetVat 

我所說的存儲的過程和結果變換成I創建的對象的方式。

StoredProcResult o = (StoredProcResult)session.createSQLQuery("exec CheckEquipmentAuthorization :replicaId") 
.addScalar("retVal", Hibernate.INTEGER) 
.setParameter("replicaId", replicaId) 
.setResultTransformer(Transformers.aliasToBean(StoredProcResult.class)) 
.setCacheMode(CacheMode.GET) 
.uniqueResult(); 

int xpto = o.getRetVal(); 

的StoredProcResult對象:

public class StoredProcResult { 
    public int retVal; 

    public int getRetVal() { 
     return retVal; 
    } 

    public void setRetVal(int retVal) { 
     this.retVal = retVal; 
    } 
}