Hibernate,存储过程和无效的参数索引错误

时间:2010-05-12 10:13:13

标签: java sql-server hibernate

我有一个SQL Server存储过程,如下所示:

CREATE PROCEDURE [dbo].[my_stored_procedure] 
    (
        @num INT,
        @name VARCHAR(50),
        @start_date DATETIME,
        @end_date DATETIME
    )
AS
BEGIN
...
END

一个带有NamedNativeQuery的实体对象,如下所示:

@Entity
@NamedNativeQuery(
    name = "myObject.myStoredProcedure",
    query = "call my_stored_procedure(:num, :name, :start_date, :end_date)",
    callable = true,
    readOnly=true,
    resultSetMapping="implicit"
)
@SqlResultSetMapping(
    name="implicit",
    entities=@EntityResult(entityClass=org.mycompany.object.MyObject.class)
)
public class MyObject implements Serializable {
...

但是当我尝试在我的DAO中调用它时:

List<MyObject> objects = (List<MyObject>) getHibernateTemplate().execute(new HibernateCallback() {
            @Override
            public Object doInHibernate(Session session) throws HibernateException {
                return session.getNamedQuery("myObject.myStoredProcedure")
                .setInteger("num", num)
                .setString("name", name)
                .setDate("start_date", startDate)
                .setDate("end_date", endDate)
                .list();
            }
        });

但是我收到了这个错误:

12 May 2010 10:55:43,040 100833 [http-8080-Processor23] ERROR org.hibernate.util.JDBCExceptionReporter  - Invalid parameter index 4.
12 May 2010 10:55:43,042 100835 [http-8080-Processor23] FATAL org.mycompany.web.controller.BasePagingController  - org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query
org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query

似乎它期待另一个参数,比如返回参数,但我尝试添加'?'调用和所有Hibernate文档建议不要这样做。

任何帮助将不胜感激。感谢

1 个答案:

答案 0 :(得分:3)

Hibernate Documentation on calling stored procedures州:

  

推荐的呼叫表格是标准的SQL92:{? = call functionName(&lt; parameters&gt;)}或{? = call procedureName(&lt; parameters&gt;)}。不支持本机调用语法。

所以第二段代码中的第4行应该是

query = "{ ? = call my_stored_procedure(:num, :name, :start_date, :end_date) }",

我不知道,你的程序返回了什么,但你也可能想检查以下内容。
更多Hibernate文档:

  

对于Sybase或MS SQL服务器   以下规则适用:

     
      
  • 该程序必须返回结果   组。请注意,因为这些服务器可以   返回多个结果集并进行更新   计数,Hibernate将迭代   结果并取得第一个结果   是一个结果集作为其返回值。   其他一切都将被丢弃。
  •   
  • 如果您可以启用SET NOCOUNT ON   程序可能会更多   高效,但这不是一个   要求。
  •