2011-12-04 45 views
2

網上有很多例子描述瞭如何使用Hibernate調用存儲過程,但是在使用Spring時,圖片會發生一些變化。用Hibernate和Spring調用存儲過程

我在MySQL的存儲過程,我想打電話: 在SQL我需要編寫如下:

CALL inrange(32.342324,32.234234); 
It returns a row with the following: `{INT},{INT},{FLOAT}` 

藉助於Spring,我使用執行休眠操作HibernateTemplate方式,我知道,有些人不喜歡它,但這是項目開始的時候的樣子,我並不急於改變它,也許在將來...

目前,我有以下代碼Java,它試圖調用該過程:

List<Object[]> resultset = hibernateTemplate 
           .findByNamedQuery("inrange", 
            person.getAddress().getLatitude(), 
            person.getAddress().getLongitude()); 

當我運行它,我得到以下休眠例外:

org.springframework.orm.hibernate3.HibernateSystemException: 
    Named query not known: inrange; 

我想,這是二人發生的事實,我沒有休眠聲明存儲過程。 我的問題是:

  • 我該如何申報?
  • 有沒有在Spring的應用程序上下文文件中聲明它的特殊方法?

回答

4

您可以在hibernate中調用本地sql查詢。

看看這個鏈接: http://www.mkyong.com/hibernate/how-to-call-store-procedure-in-hibernate/

順便說一句,如果你想打電話給你可以簡單地使用Spring的JdbcTemplate存儲過程。

注意的休眠分機可滿足您的需求: http://www.hibernatespatial.org/

+0

Hibernatespatial看起來非常酷,但是我使用的是mySQL,它出現在那裏該數據庫不支持大多數功能,特別是距離功能...... – stdcall

+0

實際上,每個DB都提供了自己的功能/功能,您可能也會爲該項目做出貢獻,以便它也可以與mySQL一起使用。祝你好運 –

3

你在混淆Hibernate的命名查詢和MySQL的存儲過程。

如果你想調用MySQL存儲過程,那麼通過Hibernate API就沒有好處。我建議你使用Spring的JdbcTemplate來執行查詢。

如果你絕對必須使用Hibernate,這樣的事情應該工作:

SQLQuery query = hibernateTemplate.getCurrentSession() 
    .createSQLQuery("SELECT inrange(:latitude, :longitude)"; 
query.setDouble("latitude", ...); 
query.setDouble("longitude", ...); 
List<Object[]> result = query.list(); // requires casting for generics 
+0

我不糊塗,google了一下,你會發現什麼,我指着。 – stdcall

3

您需要的命名查詢添加到您的Hibernate映射文件。

你可以分享你的hibernate映射文件嗎?你可以找到一些樣品here

除了以前的鏈接,你還可以通過this也。

如果您可以共享POJO,hibernate映射和您正在使用的過程,將會更容易。

This blog將幫助你。我希望你不會有任何使用getHibernateTemplate().execute(HibernateCallback)方法的問題。

+0

實際上,我沒有Hibernate映射文件。我正在使用Spring的上下文XML&Annotations進行hibernate映射。如果您覺得有幫助,我可以發佈彈簧配置。 – stdcall

+0

你可以分享POJO課程嗎? –

+0

沒有pojo,存儲過程的結果集沒有映射到pojo,而是所有的標量。 – stdcall