[英]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.