网上有很多例子描述了如何使用Hibernate调用存储过程,但是,使用Spring时,图片会有所改变。
我在MySQL中有一个存储过程,我想调用它: 在SQL中我需要编写以下内容:
CALL inrange(32.342324,32.234234);
It returns a row with the following: `{INT},{INT},{FLOAT}`
使用Spring,我使用HibernateTemplate
方式执行hibernate操作,我知道有些人不喜欢它,但这就是我开始时项目的方式,我不是这样的渴望改变它,也许将来......
目前,我在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中声明存储过程。 我的问题是:
答案 0 :(得分:5)
您可以在hibernate中调用本机sql查询。
看看这个链接: http://www.mkyong.com/hibernate/how-to-call-store-procedure-in-hibernate/
顺便说一句,如果你想调用存储过程,你可以简单地使用Spring JdbcTemplate。
请注意,hibernate扩展可以满足您的需求: http://www.hibernatespatial.org/
答案 1 :(得分: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
答案 2 :(得分:3)
您需要将命名查询添加到您的hibernate映射文件中。
你能分享你的hibernate映射文件吗?您可以找到一些示例here。
除了上一个链接,您还可以查看this。
如果你可以分享POJO,hibernate映射和你正在使用的程序,那将会更容易。
This blog对您有所帮助。我希望您使用getHibernateTemplate().execute(HibernateCallback)
方法没有任何问题。
答案 3 :(得分:0)
您可以使用JPA,因为Spring在Core或Spring Data中支持它。
可以使用StoredProcedureQuery
调用存储过程,如下所示:
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("count_comments")
.registerStoredProcedureParameter(
"postId", Long.class, ParameterMode.IN)
.registerStoredProcedureParameter(
"commentCount", Long.class, ParameterMode.OUT)
.setParameter("postId", 1L);
query.execute();
Long commentCount = (Long) query
.getOutputParameterValue("commentCount");
有关更多示例,例如调用存储过程并从结果集中提取REF_CURSOR
,请查看this article。