如何从@NamedStoredProcedureQuery获得标量结果?

时间:2017-10-15 22:00:51

标签: sql-server hibernate jpa stored-functions

如果有一个存储函数在数据库中执行内容并返回标量(例如,生成的键)。我已将其定义为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不知道它应该期望返回结果。生成的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]

现在问题非常明显。 call语句不为返回值提供bind-variable。恕我直言,它应该是{? = call dbo.do_something(?)}

我尝试将returnsResultSet=true添加到NamedStoredProcedureQuery但Hibernate 5.2.10.Final似乎没有实现 - 即使Hibernate声称与JPA 2.1兼容。另一种尝试是添加resultClass = Integer.class,但也失败了。似乎resultClass必须是一个实体。它不适用于标量。

1 个答案:

答案 0 :(得分:1)

"存储过程/函数必须返回一个结果集作为第一个能够使用Hibernate的输出参数"

请参阅16.2.2. Using stored procedures for querying以获取参考资料

尝试使用

SELECT @R

而不是

RETURN @R

您还可以尝试在RETURN之前添加SELECT(对于现有代码)