Вызов хранимой процедуры средствами Hibernate
Простой пример обращения к MS SQL
Наше приложение - админка для интернет-ТВ, расположенная на сервере потокового вещания. Одна из ее множества функций - в определенный момент времени выбирать из базы данных программу передач на следующий день и затем по таймеру запускать в эфир.
База данных располагается на стороннем сервере, и с ней работают менеджеры контента. И выборка данных осуществляется нашей админкой посредством хранимой процедуры, написанной администратором СУБД. Так что нашему приложению ничего, кроме названия процедуры, а также входных и выходных параметров, знать не надо. Удобно!
Итак, программа передач - это список треков, каждый из которых имеет наименование, путь к видео-файлу (на видео-сервере), время старта и время окончания. Код класса, представляющего трэк, будет выглядеть таким образом (getters/setters и директивы опустила, но они, разумеется, присутствуют):
package ru.premaservices.tv.manager.pojo; ... @Entity @NamedNativeQuery(name="get_playlist",query="{call [dbo].[sp_AdmGetShedulerErl](:dat)}", callable=true, resultClass=DbTrack.class) public class DbTrack { @Id @Type(type = "string") private String name; @Type(type = "string") private String pfile; @Type(type = "timestamp") private Date date_start; @Type(type = "timestamp") private Date date_end; ... }
Аннотация @Type определяет как Hibernate должен прочитать выходные значения переменных. Но самое важное - это определение хранимой процедуры при помощи аннотации @NamedNativeQuery.
- name - атрибут задает имя запроса в Hibernate
- query - вызов хранимой процедуры в терминах MS SQL (на вход передается дата)
- resultClass - класс, куда запишется результат каждой возвращенной записи
Сама процедура возвращает нам список треков DbTrack. Она вызывается в слое DAO.
package ru.premaservices.tv.manager.dao; ... @Repository public class PlaylistManager { @Autowired private SessionFactory sessionFactory; ... @SuppressWarnings("unchecked") public List<DbTrack> getPlaylistTracks (String date) { Session session = sessionFactory.getCurrentSession(); return (List<DbTrack>)session.getNamedQuery("get_playlist").setParameter("dat", date).list(); } }
А ее в свою очередь вызывает бизнес-слой, который и работает далее с полученным результатом.
package ru.premaservices.tv.manager.service; ... @Service public class PlaylistService { ... @Transactional(readOnly = true) public Playlist getPlaylistFromDatabase (String date) throws IOException { return PlaylistBuilder.build(date, manager.getPlaylistTracks(date)); } ... }
Список треков, полученный из хранимой процедуры, преобразуется в итоговый плейлист, с которым могут работать другие части системы, например, выводить его на экран менеджеру эфира или автоматически перезапускать плеер с новой программой передач.
- Тэги: хранимая процедура
Комментарии (0)