簡體   English   中英

使用 Java 和 Hibernate 從存儲過程中獲取返回值(標量),而不是結果表

[英]Get return value (scalar), not result table, from stored procedure using Java and Hibernate

我很難從使用 Hibernate 和 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 客戶端對其進行了測試)。

謝謝你。

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

在存儲過程中,我替換了

return @AuthIntValue

select @AuthIntValue as RetVat

我調用存儲過程並將結果轉換為我創建的對象的方式。

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;
    }
}

我知道這已經很老了,但我發現自己遇到了同樣的問題,並在使用 MS SQL Server 時找到了一個簡單的解決方案。 修改您的原始查詢如下:

query = session.createSQLQuery(
    "declare @result int; exec @result = CheckEquipmentAuthorization(:replicaId); select @result")
    .setParameter("replicaId", replicaId);

現在您將獲得作為query.uniqueResult()的返回碼,而無需修改原始存儲過程。 當您不能(或不想)修改原始存儲過程時,這會很方便。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM