用Hibernate和Spring调用存储过程

时间:2011-12-04 20:14:14

标签: mysql hibernate spring stored-procedures

网上有很多例子描述了如何使用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中声明存储过程。 我的问题是:

  • 我该如何宣布?
  • 是否有一种在Spring的应用程序上下文文件中声明它的特殊方法?

4 个答案:

答案 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