如何从@NamedStoredProcedureQuery 获取标量结果?
How to get a scalar result from @NamedStoredProcedureQuery?
如果有一个在数据库中执行操作的存储函数,并且 returns 是一个标量(例如,生成的密钥)。我将其定义为 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 提供程序 Hibernate 并不知道它应该期望 returned 的结果。生成的 SQL 如下所示:
12:10:34,960 INFO SchemaCreatorImpl:489 - HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@30135202'
Hibernate:
{call dbo.do_something(?,?,?,?)}
12:10:35,251 TRACE BasicBinder:95 - binding parameter [param] as [INTEGER] - [1]
现在问题很明显了。调用语句不为 return 值提供绑定变量。恕我直言,应该是 {? = call dbo.do_something(?)}
.
我已经尝试将 returnsResultSet=true
添加到 NamedStoredProcedureQuery 但 Hibernate 5.2.10.Final 似乎没有实现 - 尽管 Hibernate 声称与 JPA 2.1 兼容。另一种尝试是添加 resultClass = Integer.class
但也失败了。看来 resultClass 必须是一个实体。它不适用于标量。
"The stored procedure/function must return a resultset as the first out-parameter to be able to work with Hibernate"
参考16.2.2. Using stored procedures for querying
尝试使用
SELECT @R
而不是
RETURN @R
您也可以尝试在 RETURN 之前添加 SELECT(对于您现有的代码)
如果有一个在数据库中执行操作的存储函数,并且 returns 是一个标量(例如,生成的密钥)。我将其定义为 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 提供程序 Hibernate 并不知道它应该期望 returned 的结果。生成的 SQL 如下所示:
12:10:34,960 INFO SchemaCreatorImpl:489 - HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@30135202'
Hibernate:
{call dbo.do_something(?,?,?,?)}
12:10:35,251 TRACE BasicBinder:95 - binding parameter [param] as [INTEGER] - [1]
现在问题很明显了。调用语句不为 return 值提供绑定变量。恕我直言,应该是 {? = call dbo.do_something(?)}
.
我已经尝试将 returnsResultSet=true
添加到 NamedStoredProcedureQuery 但 Hibernate 5.2.10.Final 似乎没有实现 - 尽管 Hibernate 声称与 JPA 2.1 兼容。另一种尝试是添加 resultClass = Integer.class
但也失败了。看来 resultClass 必须是一个实体。它不适用于标量。
"The stored procedure/function must return a resultset as the first out-parameter to be able to work with Hibernate"
参考16.2.2. Using stored procedures for querying
尝试使用
SELECT @R
而不是
RETURN @R
您也可以尝试在 RETURN 之前添加 SELECT(对于您现有的代码)