2010-07-19 39 views
0

我有以下SQL查詢返回的結果,我需要:複雜的SQL查詢來的NHibernate的DetachedCriteria或HQL

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?

兩個挑戰是:

  1. 爲每行成本計算的查詢。

  2. 派生表連接(其需要是外連接該值可能不存在)

我明白任何指針。我寧願不使用SQL,因爲基礎結構發生變化以及(缺少)重構支持的問題

回答

2

請看官方的HQL示例@http://docs.jboss.org/hibernate/stable/core/reference/en/html/queryhql.html#queryhql-examples

在我看來,'派生連接'會更容易使用HQL。

在性能的情況下,我的第一步就是使用您的首選探查器使用原生SQL來獲取多少成本,然後使用NHProf在NHibernate上花費多少成本。

+0

謝謝。我會放棄一下,看看它是否有幫助。我認爲DetachedCriteria中沒有等價物呢? – IThasTheAnswer 2010-07-20 12:24:33