Сложный SQL-запрос к NHibernate DetachedCriteria или HQL - PullRequest
0 голосов
/ 19 июля 2010

У меня следующий SQL-запрос, возвращающий нужные мне результаты:

SELECT     
Person.FirstName,Person.LastName,OrganisationUnit.Name AS UnitName, RS_SkillsArea.Name AS SkillsArea, Activity.Name AS ActivityName, Activity.CLASS, Activity.StartsOn, Activity.EndsOn, 

SUM(ActivityCost.CostAmount) / 

NULLIF(
 (
  SELECT COUNT(Registration.ActivityId) FROM         
  Registration INNER JOIN AttemptResultsSummary ON Registration.CurrentResultId = AttemptResultsSummary.AttemptResultsSummaryId AND 
  Registration.RegistrationId = AttemptResultsSummary.RegistrationId
  WHERE     (Registration.Status = 1) AND (Registration.ActivityId = Activity.ActivityId) 
  AND (AttemptResultsSummary.AttendanceStatus <> 1)
 ) 
 ,0) 
 AS IndividualCost

 FROM         Registration AS Registration_1 INNER JOIN
                      Activity ON Registration_1.ActivityId = Activity.ActivityId INNER JOIN
                      Person ON Registration_1.PersonId = Person.PersonId INNER JOIN
                      OrganisationUnit ON Person.OrganisationUnitId = OrganisationUnit.OrganisationUnitId INNER JOIN
                      AttemptResultsSummary ON Registration_1.CurrentResultId = AttemptResultsSummary.AttemptResultsSummaryId AND 
                      Registration_1.RegistrationId = AttemptResultsSummary.RegistrationId AND Activity.ActivityId = AttemptResultsSummary.ActivityId AND 
                      Person.PersonId = AttemptResultsSummary.PersonId INNER JOIN 
                      ActivityCost ON Activity.ActivityId = ActivityCost.ActivityId LEFT OUTER JOIN
                          (SELECT     Category.Name, Category.CategoryId
                            FROM          Category INNER JOIN
                                                   CategoryGroup ON Category.[Group] = CategoryGroup.CategoryGroupId
                            WHERE      (CategoryGroup.Name = N'Skills Area')) AS RS_SkillsArea INNER JOIN
                      ActivityInCategory ON RS_SkillsArea.CategoryId = ActivityInCategory.CategoryId ON Activity.ActivityId = ActivityInCategory.ActivityId

AND AttemptResultsSummary.AttendanceStatus <> 1



GROUP BY RS_SkillsArea.Name, Person.FirstName,Person.LastName,Activity.Name, Activity.CLASS, Activity.StartsOn, Activity.EndsOn, Activity.ActivityId, OrganisationUnit.Name, 
                      AttemptResultsSummary.CompletionStatus, AttemptResultsSummary.AttendanceStatus

HAVING AttemptResultsSummary.AttendanceStatus <> 1

По существу, есть ли способ использовать DetachedCriteria или HQL, чтобы сделать то же самое с объектами, а не с прямым SQL?1005 * Две задачи:

  1. Запрос для расчета стоимости для строки.

  2. Производное объединение таблиц (которое должно быть внешним объединением, поскольку это значение может не существовать)

Буду признателен за любые указатели.Я бы предпочел не использовать SQL из-за изменений инфраструктуры и проблем с (отсутствием) поддержки рефакторинга

1 Ответ

2 голосов
/ 19 июля 2010

Взгляните на официальные примеры HQL @ http://docs.jboss.org/hibernate/stable/core/reference/en/html/queryhql.html#queryhql-examples.

На мой взгляд, "производные объединения" было бы еще проще осуществить с помощью HQL.

В случае с производительностью мой первый старт будет состоять в том, чтобы узнать, сколько это стоит с использованием собственного SQL с использованием предпочитаемого вами профилировщика, а затем, сколько это будет стоить в NHibernate с использованием NHProf.

...