【问题标题】:Hibernate, Stored Procedures and Invalid Parameter Index Error休眠、存储过程和无效参数索引错误
【发布时间】:2010-05-12 10:13:13
【问题描述】:

我有一个如下所示的 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 文档都建议反对这一点。

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

【问题讨论】:

    标签: java sql-server hibernate


    【解决方案1】:

    Hibernate Documentation on calling stored procedures 声明:

    推荐的调用形式是标准的SQL92:{? = 调用 functionName() } 或 { ? = 调用过程名称()}。不支持本机调用语法。

    所以你的第二个 sn-p 中的第 4 行应该是

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

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

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

    • 过程必须返回结果 放。请注意,由于这些服务器可以 返回多个结果集并更新 计数,Hibernate 将迭代 结果并取第一个结果 是一个结果集作为它的返回值。 其他所有内容都将被丢弃。
    • 如果您可以在您的 程序可能会更多 高效,但这不是 要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多