2013-04-15 47 views
1

我無法使用會話工廠如何使用Session Factory從Java Hibernate執行sql存儲過程?

我寫了一個SQL過程,它需要5個參數,並返回結果集,它在MS SQL工作室工作正常

EXEC SlaGrid @appID=245,@fromYear=2012,@toYear=2013,@fromMon=1,@toMon=12 --- sql 

EXEC SlaGrid @applID=:applID,@fromYear=:fromYear,@toYear=:toYear,@fromMon=:fromMon,@toMon=:toMon --hibernate 

從Java休眠叫我的存儲過程我am設置上述查詢的參數

String queryString = "EXEC SlaGrid @applID=:applID,@fromYear=:fromYear,@toYear=:toYear,@fromMon=:fromMon,@toMon=:toMon" 

Query query = sessionFactory.getCurrentSession().createSQLQuery(queryString); 

//set query parameters here 

query.list() --- giving sql grammer exception 

回答

2

我解決它只需通過下面的代碼...只是通過在CSV.Thanks爲幫助傢伙參數..

String queryString = "SlaGrid 245,2012,2013,1,12" 

Query query = sessionFactory.getCurrentSession().createSQLQuery(queryString); 

query.list(); 

完美的作品:)

+1

'query.list();'在Hibernate 4中沒有爲我工作,而是我使用'query.executeUpdate()' – Metalhead89

+0

感謝像魅力一樣工作 –

+0

這是否獨立於數據庫類型或MySQL是否特定? – bcampolo

6

您可以在hibernate會話上使用callable statement

Connection con = getSessionFactory().getCurrentSession().connection(); 

/** 
* Amend to include your parameters and proc 
*/   
CallableStatement cs = con.prepareCall("{ call myprocedure }"); 

cs.execute(); 
0

試試這個

Query query = sessionFactory.getCurrentSession().createSQLQuery(
    "CALL SlaGrid(:appID, :fromYear, :toYear, :fromMon, :toMon)") 
    .setParameter("appID", 245) 
    .setParameter("fromYear", 2012) 
    .setParameter("toYear", 2013) 
    .setParameter("fromMon", 1) 
    .setParameter("toMon", 12); 
+0

我已經嘗試過這個..這個語法是針對mysql而不是mssql的 –

5

創建一個SessionFactory並打開一個會話,然後

CallableStatement callableStatement = session.connection().prepareCall("call GetMarketDataCDS(?,?)"); 
callableStatement.setString(1,"JPM"); 
callableStatement.registerOutParameter(1, OracleTypes.CURSOR); 
callableStatement.execute(); 
ResultSet resultSet=(ResultSet) callableStatement.getObject(1); 

我在這裏使用的是Oracle,我的第一個參數是在參數及第二是OUT是什麼但返回多行的結果集。 然後在最後一行中,我們得到ResultSet與所有行,然後您可以遍歷行。

+0

'connection()'方法已被棄用,不是嗎? – Tony

+0

@Tony,使用'session.doWork(...)' – Andremoniy