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

Автор PremaServices - Четверг, 20 Июнь 2013. В рубриках: Запросы к базе данных, 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.0/5 оценка (0 голосов)
  • Тэги: хранимая процедура

Об авторе

Комментарии (0)

Оставить комментарий

Вы комментируете как Гость.