2011-12-04 25 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