2017-10-15 95 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