2010-07-19 23 views
0

je la requête SQL suivante retourner les résultats que je besoin:requête SQL complexe à NHibernate DetachedCriteria ou 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 

est essentiellement il possible en utilisant soit DetachedCriteria ou HQL faire la même chose contre les entités plutôt que directe SQL?

Les deux défis sont les suivants:

  1. La requête pour le calcul des coûts par ligne.

  2. La table dérivée join (qui doit être une jointure externe que cette valeur ne peut pas exister)

J'apprécierais des pointeurs. Je préférerais ne pas utiliser SQL à cause des changements d'infrastructure et des problèmes avec le support de refactoring (manque de)

Répondre

2

Jetez un oeil aux exemples officiels HQL @http://docs.jboss.org/hibernate/stable/core/reference/en/html/queryhql.html#queryhql-examples. À mon avis, les 'jointures dérivées' seraient encore plus faciles à retirer en utilisant HQL. Dans le cas des performances, mon premier départ consisterait à savoir combien cela coûte en utilisant du SQL natif en utilisant votre profileur préféré, et ensuite combien cela coûte sur NHibernate en utilisant NHProf.

+0

Merci. Je vais essayer et voir si ça aide. Je suppose qu'il n'y a pas d'équivalents dans DetachedCriteria alors? – IThasTheAnswer