网上有很多例子描述了如何使用Hibernate调用存储过程,但是,当使用Spring时,图片会有所改变 .
我在MySQL中有一个存储过程,我想调用它:在SQL中我需要编写以下内容:
CALL inrange(32.342324,32.234234);
It returns a row with the following: `{INT},{INT},{FLOAT}`
使用Spring,我使用 HibernateTemplate
执行hibernate操作的方式,我知道你们中的一些人赢得了't like it, but this is the how the project was when I started, and I' m并不那么渴望改变它,也许将来......
目前,我在Java中有以下代码,它试图调用该过程:
List<Object[]> resultset = hibernateTemplate
.findByNamedQuery("inrange",
person.getAddress().getLatitude(),
person.getAddress().getLongitude());
当我运行它时,我得到以下Hibernate异常:
org.springframework.orm.hibernate3.HibernateSystemException:
Named query not known: inrange;
我认为这是发生的事实,我没有在hibernate中声明存储过程 . 我的问题是:
-
如何申报?
-
有没有一种特殊的方法在Spring的应用程序上下文文件中声明它?
4 回答
您可以在hibernate中调用本机sql查询 .
看看这个链接:http://www.mkyong.com/hibernate/how-to-call-store-procedure-in-hibernate/
顺便说一下,如果你想调用存储过程,你可以简单地使用Spring JdbcTemplate .
请注意,hibernate扩展可以满足您的需求:http://www.hibernatespatial.org/
您将Hibernate的命名查询与MySQL的存储过程混淆 .
如果你想调用MySQL存储过程,那么通过Hibernate的API这样做是没有好处的 . 我建议你使用Spring的JdbcTemplate来执行查询 .
如果你绝对必须使用Hibernate,这样的东西应该工作:
您需要将命名查询添加到您的hibernate映射文件中 .
你能分享你的hibernate映射文件吗?你可以找到一些样品here .
与上一个链接一起,您也可以通过this .
如果您可以共享POJO,hibernate映射和您正在使用的过程将更容易 .
This blog对您有所帮助 . 我希望你使用
getHibernateTemplate().execute(HibernateCallback)
方法没有任何问题 .您可以使用JPA,因为Spring在Core或Spring Data中支持它 .
可以使用
StoredProcedureQuery
来调用存储过程,如下所示:有关更多示例,例如调用存储过程并从结果集中获取
REF_CURSOR
,请查看this article .