2012-01-13 6 views
0

こんにちは私は毎月賢明なテーブルjan、feb..decを持っています。それぞれのテーブルに繰り返しロケートとアクションカウントフィールドがあります。sqlクエリで、ハイバネートクエリへの変換

私はこのクエリをSQLで大まかに書いています。今月のドメインオブジェクトがあります。これをHibernate Query(HQLまたはCriteria APIなど)に変換する必要があります。どのように私はそれを変換するのですか? 月の数はリストとして提供されていますので、 の下のsqlはこのリストのmonthsToQuery = [oct,nov,dec,jan]です。これも可変リストです。これは、[2月、傷、4月]または[7月]

select loc, sum(tcount) from (
        (select location as loc, sum(actioncount) as tcount from oct group by location) left-join 
        (select location as loc, sum(actioncount) as tcount from nov group by location) left-join 
        (select location as loc, sum(actioncount) as tcount from dec group by location) left-join 
        (select location as loc, sum(actioncount) as tcount from jan group by location) 

        ) group by loc 

することができ、私は左を をやっている私は別の数ヶ月の間で任意の場所を失いたくないので、参加します。

追加:日付範囲も入力しています。これまでのところ、私は範囲から数ヶ月のリストを取得しており、毎月separatleyの結果を得ています。私は1つのクエリで最終的な必要な結果を与えるためにクエリを記述する必要があります。ここ は私が今まで持っているものです。

// sTblList - list of all month domains in the date range.. 
def getSummary(sTblList,SfromDate,StoDate,res_id, groupCol,sumCol){ 
     try{ 
     Date fromDate = new Date().parse("yyyy-MM-dd", SfromDate); 
     Date toDate = new Date().parse("yyyy-MM-dd", StoDate); 

     def resourceInstance=Resources.get(res_id); 
     sTblList.each{ 
     def OnemonthList=it.createCriteria().get {  
      eq('graresource',resourceInstance) 
      between('currentdate', fromDate, toDate)   
      projections { 
      sum(sumCol,'tcount') 
      groupProperty(groupCol)  
       }     
      }  

     return sumMap // sumMap should have all months results combined 
    } 

私の代わりに、ネストのcriteriasの私も基準にエイリアスを使用することができますいくつかの場所をお読みください。私はこれに新しいです.. 誰も知っていますか?

+0

私は希望スキーマを正規化して開始し、月の列を持つ単一の表を持つようにします。この方法ですべてがずっと簡単になります。 –

+0

私たちはパフォーマンスと集計のためにデータを12個のテーブルに分けましたが、そうでなければ5千万のレコードを持つ巨大なテーブルです。 –

+0

月のインデックスのインデックスを使用すると、おそらくこれらのすべてのテーブルを結合するよりもはるかに高速になります。 5000万人は良いデータベースではありません。 –

答えて

1

モデルが使用されている場合

abstract class Month 
{ 
    string location; 
    int actionCount; 
} 

class January extends Month 
{ 
} 

session.CreateCriteria(Month.class) 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.GroupProperty("Location")) 
     .Add(Projections.Sum("ActionCount"))) 

または

class Month implements HasActionCount 
{ 
    string location; 
    int actionCount; 
} 

session.CreateCriteria(HasActionCount.class) 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.GroupProperty("Location")) 
     .Add(Projections.Sum("ActionCount"))) 

がアップデートされたインターフェースの継承:NHibernateのとSQLiteのための以下の作品は(も休止状態で動作するはずです)

class Month 
{ 
    public virtual int Id { get; set; } 
    public virtual string Location { get; set; } 
    public virtual int ActionCount { get; set; } 
} 

class January : Month 
{ 
} 

class February : Month 
{ 
} 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class xmlns="urn:nhibernate-mapping-2.2" name="ConsoleApplication1.January, ConsoleApplication1" table="`January`"> 
    <id name="Id"> 
     <generator class="identity" /> 
    </id> 
    <property name="Location" /> 
    <property name="ActionCount" /> 
    </class> 
    <class xmlns="urn:nhibernate-mapping-2.2" name="ConsoleApplication1.February, ConsoleApplication1" table="`February`"> 
    <id name="Id"> 
     <generator class="identity" /> 
    </id> 
    <property name="Location" /> 
    <property name="ActionCount" /> 
    </class> 
</hibernate-mapping> 

// works as expected 
IList<Month> months = session.CreateCriteria<Month>().List<Month>(); 

// returns the location and sum of each month though 
IList<Object[]> sums = (Object[])session.CreateCriteria<Month>() 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.GroupProperty("Location")) 
     .Add(Projections.Sum("ActionCount"))) 
    .List(); 
+0

チップのおかげで..月のドメインクラスはすべての場所と12個の月間のテーブルからのアクションカウントをすべて格納するでしょうか? 12のテーブルの挿入は、バックグラウンドで実行される夜間のジョブによって行われるため、この基本ドメインに対しても挿入プロセスを実行する必要がありますか? –

+0

あなたはすべての月をseperatlyにマッピングする必要がありますが、hibernateは、基底クラスをクエリするときに継承されたすべてのクラスをクエリし、継承されたクラス(january、...)のリストを返さなければならないことを知るのに十分です。生成されたSQLはクエリのように見えます。同じことがインターフェイスと一緒に行く、私はインターフェイスがマッピングされる必要があるかどうかわからない、多分そうではない。 – Firo

+0

また、クラス月が抽象である必要があるという関連記事を読んだだけですか? –

関連する問題