Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы Java и C# технологии.doc
Скачиваний:
171
Добавлен:
01.03.2016
Размер:
3.04 Mб
Скачать
      1. Способы выборки объектов в FluentNHibernate

В FluentNHibernateсуществует 4 способа выборки объектов:

  • NativeSQL;

  • запросы по критерию;

  • запросы по образцу;

  • язык запросов HQL (Hibernate Query Language).

Рассмотрим каждый из способов.

        1. Запросы NativeSql

Механизм запрос NativeSQLпозволяет выполнять запросы, написанные на обычном языкеSQL. В метод просто передается запрос в виде текстовой строки.

Рассмотрим пример, в котором с базы данных выбирается набор объектов класса студент:

var list = session.CreateSQLQuery(

"SELECT Students.* FROM Students")

.AddEntity("Student", typeof(Student))

.List<Student>();

Как видно из примера, запрос на выборку просто передается в метод CreateSQLQuery сессии NHibernate. Запрос может быть любой сложности но при написании запросов с использованием NativeSQLнеобходимо задуматься, а какого типа будут объекты в возвращаемой коллекции.

        1. Запросы по критерию

Вторым и очень удобным способом выборки объектов с базы является запрос по критерию.

Рассмотрим пример, в котором с базы выбираются все те же студенты по разным признакам.

В первом критерии выбираются студенты мужского пола:

ICriteria criteria1 = session.CreateCriteria(typeof(Student))

.Add(Expression.Eq("Sex", 'M'))

.SetMaxResults(10);

list = criteria1.List<Student>();

Во втором примере выбираются студенты, у которых имя начинается на букву К, список упорядочен по фамилии по возрастанию и по году рождения по убыванию:

ICriteria criteria2 = session.CreateCriteria(typeof(Student))

.Add(Expression.Like("FirstName", "K%"))

.AddOrder(Order.Asc("LastName"))

.AddOrder(Order.Desc("Year"));

list = criteria2.List<Student>();

В третьем примере выбирается список студентов, у которых год рождения находится между 1993 и 1994 годами:

ICriteria criteria3 = session.CreateCriteria(typeof(Student))

.Add(Expression.Between("Year", 1993, 1994));

list = criteria3.List<Student>();

Более детально с запросами по критерию можно ознакомиться в книге NHibernateinAction.

        1. Запросы по образцу

Запросы по образцу основаны на создании объекта образца, который похож на объекты, которые необходимо выбрать с базы данных.

Рассмотрим пример запроса по образцу для студента. В примере создается объект шаблон с заполненными полями пола и года рождения. Потом на основании этого объекта создается пример, который потом передается в критерий.

//Создание объекта образца

Student s1 = new Student();

s.Sex = 'M';

s.Year = 1994;

//Создание примера

Example example = Example.Create(s1)

.ExcludeZeroes()

.ExcludeProperty("Year")

.IgnoreCase()

.EnableLike();

//Передача примера в качестве параметра в критерий

ICriteria criteria5 = session.CreateCriteria(typeof(Student))

.Add(example);

list = criteria5.List<Student>();

        1. Запросы hql

Кроме трех выше описанных способов существует еще один очень удобный способ выборки объектов с базы данных – язык запросов HQL, который позволяет полностью абстрагироваться от реляционных баз данных и заставить программиста мыслить исключительно объектами домена.

Рассмотрим пару примеров запросов на HQL.

В первом примере выбираются все студенты с именем Кристина:

IQuery query = session.CreateQuery("from Student as stud where stud.FirstName = :Name");

query.SetAnsiString("Name", "Kristina");

list = query.List<Student>();

Во втором примере выбираются фамилии всех студентов,у которых имя группы похоже на«KI-»:

IQuery query1 = session.CreateQuery("select st.LastName from Student as st inner join st.Group as gr where gr.GroupName like 'KI-%'");

IList<String> list1 = query1.List<String>();

Более подробно с запросами HQL можно ознакомиться в книге NHibernateinAction.