2011-12-04 25 views
2

Hibernateを使用してストアドプロシージャを呼び出す方法については、ネット上で多くの例がありますが、Springを使用する場合は、ピクチャが少し変わります。私は次のように記述する必要があるSQLで :HibernateとSpringでストアドプロシージャを呼び出す

私は、私が電話をかけたいのMySQLのストアドプロシージャを持っている

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

春で、私は休止操作を実行するHibernateTemplate方法を使用して、私がいることを知っていますあなたの中にはそれが気に入らない人もいるかもしれませんが、これは私が始めたときのプロジェクトの様子です。将来はおそらくそれを変えたいと思っていません...

現在、プロシージャを呼び出そうとするJava:

私はそれを実行すると
List<Object[]> resultset = hibernateTemplate 
           .findByNamedQuery("inrange", 
            person.getAddress().getLatitude(), 
            person.getAddress().getLongitude()); 

は、私は次のHibernateの例外を取得:

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

が、私はこれは私が休止状態にストアドプロシージャを宣言しなかったという事実デュオが起こっていることを考え出し。 私の質問は:

  • どのように宣言しますか?
  • Springのアプリケーションコンテキストファイルでそれを宣言する特別な方法はありますか?

答えて

4

hibernate内でネイティブSQLクエリを呼び出すことができます。このリンクで

ルック:ところで、あなたは、単に春JdbcTemplateを使用することができますストアドプロシージャを呼び出したい場合は http://www.mkyong.com/hibernate/how-to-call-store-procedure-in-hibernate/

。休止状態の拡張子は、あなたのニーズに合うことができることを

お知らせ: http://www.hibernatespatial.org/

+0

Hibernatepatialは非常にクールに見えますが、私はmySQLを使用していますその機能のほとんどは、そのDB、特に距離関数ではサポートされていません... – stdcall

+0

実際には、各DBは独自の機能を提供しています。がんばろう –

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

は私が混乱しないんだけど、少しグーグル、あなたは私が指してるものを見つけることができます。 – stdcall

3

あなたのHibernateマッピングファイルに名前付きクエリを追加する必要があります。

あなたのハイバネートマッピングファイルを共有できますか?あなたはいくつかのサンプルを見つけることができますhere

前のリンクに加えて、thisもあります。

POJO、休止状態のマッピング、および使用している手順を共有できる方が簡単です。

This blogあなたに役立つでしょう。 getHibernateTemplate().execute(HibernateCallback)メソッドの使用に問題がないことを願っています。

+0

実際、私はHibernateマッピングファイルを持っていません。私は、SpringのコンテキストXML&Annotationsを使用して、Hibernateマッピングを行っています。私は春の構成を投稿することができます。 – stdcall

+0

POJOクラスを共有できますか? –

+0

ストアドプロシージャの結果セットであるpojoはありません。pojoにはマッピングされていません。すべてのスカラーです。 – stdcall

関連する問題