我有一个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文档建议不要这样做。
任何帮助将不胜感激。感谢
答案 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 程序可能会更多 高效,但这不是一个 要求。