1

我很难从使用 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 客户端对其进行了测试)。

谢谢你。

4

3 回答 3

2

这似乎是this的副本。您是否映射了存储过程的标量返回类型?你翻译成那个返回类型了吗?

于 2012-05-13T18:33:22.540 回答
2

在存储过程中,我替换了

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;
    }
}
于 2012-05-15T21:46:24.663 回答
0

我知道这已经很老了,但我发现自己遇到了同样的问题,并在使用 MS SQL Server 时找到了一个简单的解决方案。修改您的原始查询如下:

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

现在您query.uniqueResult()无需修改​​原始存储过程即可获得返回码。当您不能(或不想)修改原始存储过程时,这会很方便。

于 2020-06-26T03:59:43.123 回答