如何从@NamedStoredProcedureQuery获取标量结果?
问题描述:
如果有一个存储函数在数据库中执行内容并返回一个标量(例如,生成的密钥)。我已经将它定义为一个NamedStoredProcedureQuery:如何从@NamedStoredProcedureQuery获取标量结果?
@NamedStoredProcedureQuery(name="do_something",
procedureName = "dbo.do_something",
parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, type = Integer.class, name = "param")
}
)
我打电话使用实体管理器的功能:
Query doSomethingQuery = em.createNamedStoredProcedureQuery("do_something");
doSomething.setParameter("param", 1);
Object result = doSomething.getSingleResult();
存储的函数被调用,但似乎我的JPA提供者,休眠,不知道它应该期望结果被返回。生成的SQL如下所示:
12:10:34,960 INFO SchemaCreatorImpl:489 - HHH000476: Executing import script 'org.hiber[email protected]30135202'
Hibernate:
{call dbo.do_something(?,?,?,?)}
12:10:35,251 TRACE BasicBinder:95 - binding parameter [param] as [INTEGER] - [1]
现在问题很明显。调用语句不会为返回值提供绑定变量。恕我直言,它应该是{? = call dbo.do_something(?)}
。
我曾尝试将returnsResultSet=true
添加到NamedStoredProcedureQuery,但Hibernate 5.2.10.Final似乎没有实现 - 即使Hibernate声称是JPA 2.1兼容。另一个尝试是添加resultClass = Integer.class
,但也失败了。看起来resultClass必须是一个实体。它不适用于标量。
答
“存储过程/函数必须返回一个结果集,作为第一个出来的参数能够与Hibernate的工作”
参考见16.2.2. Using stored procedures for querying
尝试使用
SELECT @R
而不是
RETURN @R
您还可以尝试在返回之前添加SELECT(针对您的现有代码)
sp以哪种方式返回标量值?输出参数,SELECT @R或RETURN @R? – MtwStark
它使用RETURN @R。 – fhossfel