2013-09-25 7 views
0

У меня есть хранимая процедура в моем проекте под SQL/my_prod.sqlJPA: Как вызвать хранимую процедуру

там у меня есть функция delete_entity

В моей сущности

@NamedNativeQuery(name = "delete_entity_prod", 
query = "{call /sql/delete_entity(:lineId)}", 

и Я называю это

Query query = entityManager.createNamedQuery("delete_entity_prod") 
       setParameter("lineId",lineId); 

Я последовал этому примеру: http://objectopia.com/2009/06/26/calling-stored-procedures-in-jpa/

но он не выполняет удаление и не отправляет никаких ошибок.

Я не нашел четкой информации об этом, я что-то упустил? Может быть, мне нужно сначала загрузить my_prod.sql? Но как?

+0

Возможный дубликат [Вызов хранимой процедуры из Java/JPA] (http : //stackoverflow.com/questions/3572626/calling-stored-procedure-from-java-jpa) – Vadzim

ответ

1

Это на самом деле они, как вы создаете запрос.

Query query = entityManager.createNamedQuery("delete_entity_prod") 
      setParameter("lineId",lineId); 

Для вызова необходимо выполнить:

query.executeUpdate(); 

Конечно, DB уже должен содержать процедуру.Поэтому, если вы определили его в своем файле SQL, посмотрите на Executing SQL Statements from a Text File (это для MySQL, но другие системы баз данных используют аналогичный подход для выполнения сценариев)

1

Ошибка не отображается, потому что запрос не выполняется ни в какой точке - создается только экземпляр запроса. Запрос может быть выполнен путем вызова executeUpdate:

query.executeUpdate(); 

Тогда возникнет следующая проблема: Написание некоторые хранимые процедуры в файл не достаточно - процедуры жить в базе данных, а не в файлах. Следующее, что нужно сделать, это проверить, что есть правильный скрипт для создания хранимой процедуры в руках (возможно, в настоящее время это содержимое sql/my_prod.sql), а затем использовать это для создания процедуры через клиент базы данных.

Все реализации JPA не поддерживают вызов хранимых процедур, но я предполагаю, что Hibernate используется под капотом, потому что это также используется в связанном учебнике.

Это может быть так, что ток

{call /sql/delete_entity(:lineId)} 

правильно синтаксис вызова хранимой процедуры в базе данных. Это выглядит довольно подозрительно из-за /sql/. Если выяснится, что это неправильно синтаксис, то:

  1. Обратитесь к руководству для правильного синтаксиса
  2. Test с помощью клиента
  3. Использования, что в качестве значения атрибута query в NamedNativeQuery аннотации.

Все это с сочетанием MySQL + Hibernate объясняется, например, here.

Смежные вопросы