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

Posted

技术标签:

【中文标题】如何从@NamedStoredProcedureQuery 获得标量结果?【英文标题】:How to get a scalar result from @NamedStoredProcedureQuery? 【发布时间】:2017-10-15 22:00:50 【问题描述】:

如果有一个存储函数在数据库中执行操作并返回一个标量(例如,生成的密钥)。我已将其定义为 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 语句不为返回值提供绑定变量。恕我直言,应该是? = call dbo.do_something(?)

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

【问题讨论】:

sp以何种方式返回标量值?输出参数,SELECT @R 还是 RETURN @R? 它使用 RETURN @R. 【参考方案1】:

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

参考16.2.2. Using stored procedures for querying

尝试使用

SELECT @R

而不是

RETURN @R

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

【讨论】:

感谢您指出文档中的部分。我想这是正确的答案,但恐怕我无法更改程序的签名,因为它被遗留代码使用。我可能不得不使用包装器。我将提交一份 CR,以便将此功能添加到 Hibernate。 只需在 RETURN 之前添加 SELECT,这应该适用于现有代码

以上是关于如何从@NamedStoredProcedureQuery 获得标量结果?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从回收器适配器发送到片段 |如何从 recyclerview 适配器调用片段函数

如何从 Firebase 获取所有设备令牌?

如何直接从类调用从接口继承的方法?

如何从服务器获取和设置 android 中的 API(从服务器获取 int 值)?如何绑定和实现这个

如何从Mac从android studio中的fabric注销? [复制]

如何从设备中获取 PDF 文件以便能够从我的应用程序中上传?