2010-05-09 3 views
1

Я строю сайт на вершине nhibernate. Есть ли эффективный способ создания отчетов? BY, я имею в виду, что все равно выполняется сложный запрос, который захватывает случайные фрагменты данных? Хранимые процедуры? HQL?NHibernate и отчетность

Могу ли я получить одиночные, не отображаемые значения из hql?

+0

Можно ли даже вытащить случайные значения без значения из запроса hql? –

ответ

2

Да, вы можете.

Для простых вещей вы можете использовать HQL и выбирать материал в новый объект, не отображаемый (его класс должен быть «зарегистрирован» с NH, но сам по себе не отображается). Синтаксис HQL выглядит так: выберите новый NonMappedClass (column1, column2). Для этого нужен соответствующий конструктор.

Отчеты с использованием HQL быстро ломаются. Я часто обнаружил, что точно знаю, что делать в SQL, но с трудом разбираюсь в способе HQL. Кроме того, отсутствие реальных программных средств для HQL замедляет вас (извините NH Query Analyzer не сокращает его). В этом случае вы можете определить raw с ассоциированным. При выполнении этих запросов NH вернет вам IList массива Object. Вам нужно, чтобы объект Object() был в соответствующем типе. Вам понадобится это для расширенных запросов к отчетности.

Этот материал отличает склонность к ошибкам и отсасывает большое время. Таким образом, вы сделали хороший трансформатор запросов AliasToBean, который может сопоставить имя столбца набора результатов с свойством (имена должны совпадать, конечно). Я не знаю о последнем релизе NH, но у более старого 1.2.1 AliasToBean-конвертера, похоже, была ошибка, в которой он должен был преобразовать значение типа nullable в значение по умолчанию этого типа, а не устанавливать его в null. т.е.: int? будет 0 вместо нуля, если связанное поле БД было нулевым. В некоторых случаях это мешало мне использовать AliasToBean, и мне пришлось сопоставлять их вручную.

Лучший совет - не попасть в ловушку выполнения сложных отчетов с помощью вашего бизнес-объекта и для циклов. Я видел это в производстве. Это будет ужас производительности, так как ваши таблицы растут по размеру.

+0

Извините S.O. исказил мой текст. Я имел в виду: в этом случае вы можете определить необработанный SQL-запрос с соответствующим набором результатов. –

1

Да, вы можете это сделать. Это называется динамическим экземпляром. Синтаксис в HQL является

select new MyClass(cust.age) 
from customers cust 

Или с критериями:

.SetProjection(Projections.ProjectionList() 
    .Add(Projections.Name("cust.age"), "age") 
.SetResultTransformer(Transformers.AliasToBean<MyClass>()) 

Помните, что вы должны иметь соответствующий конструктор на MyClass!

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