首页 文章

用Hibernate和Spring调用存储过程

提问于
浏览
2

网上有很多例子描述了如何使用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 回答

  • 0

    您可以在hibernate中调用本机sql查询 .

    看看这个链接:http://www.mkyong.com/hibernate/how-to-call-store-procedure-in-hibernate/

    顺便说一下,如果你想调用存储过程,你可以简单地使用Spring JdbcTemplate .

    请注意,hibernate扩展可以满足您的需求:http://www.hibernatespatial.org/

  • 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
    
  • 3

    您需要将命名查询添加到您的hibernate映射文件中 .

    你能分享你的hibernate映射文件吗?你可以找到一些样品here .

    与上一个链接一起,您也可以通过this .

    如果您可以共享POJO,hibernate映射和您正在使用的过程将更容易 .

    This blog对您有所帮助 . 我希望你使用 getHibernateTemplate().execute(HibernateCallback) 方法没有任何问题 .

  • 5

    您可以使用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 .

相关问题