Вызов хранимой процедуры в Hibernate и Spring - PullRequest
2 голосов
/ 05 декабря 2011

В сети есть много примеров, которые описывают, как вызывать хранимую процедуру с помощью Hibernate, однако при использовании Spring картина немного меняется.

У меня есть хранимая процедура в MySQL, которую яхочу позвонить: в SQL мне нужно написать следующее:

CALL inrange(32.342324,32.234234);
It returns a row with the following: `{INT},{INT},{FLOAT}`

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

В настоящее время у меня есть следующий код на Java, который пытается вызвать процедуру:

List<Object[]> resultset = hibernateTemplate
                               .findByNamedQuery("inrange",
                                    person.getAddress().getLatitude(),
                                    person.getAddress().getLongitude());

Когда я его запускаю, я получаю следующее исключение Hibernate:

org.springframework.orm.hibernate3.HibernateSystemException:
   Named query not known: inrange;

Я понял, что это происходит из-за того, что я не объявил хранимую процедуру вспящий режим.Мой вопрос:

  • как мне это объявить?
  • Есть ли специальный способ объявить его в файле контекста приложения Spring?

Ответы [ 4 ]

5 голосов
/ 10 декабря 2011

Вы можете вызывать собственные SQL-запросы в Hibernate.

Посмотрите эту ссылку: http://www.mkyong.com/hibernate/how-to-call-store-procedure-in-hibernate/

Кстати, если вы хотите вызывать хранимые процедуры, вы можете просто использовать Spring JdbcTemplate.

Обратите внимание, что расширение Hibernate может соответствовать вашим потребностям: http://www.hibernatespatial.org/

3 голосов
/ 07 декабря 2011

Вам необходимо добавить именованный запрос в файл сопоставления гибернации.

Можете ли вы поделиться файлом сопоставления гибернации?Вы можете найти некоторые образцы здесь .

Наряду с предыдущей ссылкой вы также можете пройти через this .

Будет проще, если вы сможетеподелиться POJO, отображением гибернации и процедурой, которую вы используете.

Этот блог будет вам полезен.Надеюсь, у вас не возникнет проблем с использованием метода getHibernateTemplate().execute(HibernateCallback).

3 голосов
/ 05 декабря 2011

Вы путаете именованные запросы Hibernate с хранимыми процедурами MySQL.

Если вы хотите вызывать хранимый процесс MySQL, делать это через API Hibernate не имеет смысла.Я рекомендую вам использовать Spring JdbcTemplate для выполнения запроса.

Если вам абсолютно необходимо использовать Hibernate, что-то вроде этого должно работать:

SQLQuery query = hibernateTemplate.getCurrentSession()
  .createSQLQuery("SELECT inrange(:latitude, :longitude)";
query.setDouble("latitude", ...);
query.setDouble("longitude", ...);
List<Object[]> result = query.list(); // requires casting for generics
0 голосов
/ 07 апреля 2018

Вы можете использовать JPA, поскольку Spring поддерживает его в Core или Spring Data.

Вызов хранимой процедуры можно выполнить с помощью StoredProcedureQuery следующим образом:

StoredProcedureQuery query = entityManager
    .createStoredProcedureQuery("count_comments")
    .registerStoredProcedureParameter(
        "postId", Long.class, ParameterMode.IN)
    .registerStoredProcedureParameter(
        "commentCount", Long.class, ParameterMode.OUT)
    .setParameter("postId", 1L);

query.execute();

Long commentCount = (Long) query
    .getOutputParameterValue("commentCount");

Для получения дополнительных примеров, таких как вызов хранимой процедуры и извлечение REF_CURSOR из набора результатов, посмотрите эту статью .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...