0

必要な結果を返す次の 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 ではなくエンティティに対して同じことを行う方法はありますか?

2 つの課題は次のとおりです。

  1. 行ごとのコスト計算のクエリ。

  2. 派生テーブルの結合 (この値が存在しない可能性があるため、外部結合である必要があります)

ポインタをいただければ幸いです。インフラストラクチャの変更と、リファクタリングのサポート (の欠如) に関する問題のため、SQL は使用したくありません。

4

1 に答える 1

2

公式の HQL の例 @ http://docs.jboss.org/hibernate/stable/core/reference/en/html/queryhql.html#queryhql-examplesをご覧ください。

私の意見では、「派生結合」は、HQL を使用するとさらに簡単に実現できると思います。

パフォーマンスの場合、最初に、お好みのプロファイラーを使用してネイティブ SQL を使用した場合のコストを把握し、次に NHProf を使用して NHibernate でコストを把握することから始めます。

于 2010-07-19T12:16:01.630 に答える