Ошибка спящего режима, хранимых процедур и неверного индекса параметра - PullRequest
1 голос
/ 12 мая 2010

У меня есть хранимая процедура SQL Server, которая выглядит следующим образом:

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

И объект Entity с 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 Ответ

3 голосов
/ 13 мая 2010

Документация Hibernate о вызове хранимых процедур сообщает:

Рекомендуемая форма вызова - это стандарт SQL92: {? = вызвать имя_функции ()} или {? = вызов имени процедуры ()}. Собственный синтаксис вызова не поддерживается.

Таким образом, 4-я строка в вашем втором фрагменте, вероятно, должна быть

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

Я не знаю, что возвращает ваша процедура, но вы можете также проверить следующее.
Еще больше документации по Hibernate:

Для сервера Sybase или MS SQL применяются следующие правила:

  • Процедура должна возвращать результат задавать. Обратите внимание, что, поскольку эти серверы могут вернуть несколько результирующих наборов и обновить рассчитывает, Hibernate будет повторять результаты и принять первый результат, который является результатом набора в качестве возвращаемого значения. Все остальное будет отброшено.
  • Если вы можете включить SET NOCOUNT ON в вашем Процедура, вероятно, будет более эффективный, но это не требование.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...