2017-10-15 132 views
0

如果有一个存储函数在数据库中执行内容并返回一个标量(例如,生成的密钥)。我已经将它定义为一个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必须是一个实体。它不适用于标量。

+0

sp以哪种方式返回标量值?输出参数,SELECT @R或RETURN @R? – MtwStark

+0

它使用RETURN @R。 – fhossfel

回答

1

“存储过程/函数必须返回一个结果集,作为第一个出来的参数能够与Hibernate的工作”

参考见16.2.2. Using stored procedures for querying

尝试使用

SELECT @R 

而不是

RETURN @R 

您还可以尝试在返回之前添加SELECT(针对您的现有代码)

+0

感谢您指出文档中的部分。我想这是正确的答案,但恐怕我不能更改该过程的签名,因为遗留代码使用它。我可能将不得不使用包装。 我将提交一个CR,以便将此功能添加到Hibernate中。 – fhossfel

+0

只是在RETURN之前添加SELECT,这应该与现有代码一起使用 – MtwStark