2012-01-13 3 views
0

안녕하세요 저는 현명한 테이블 인 jan, feb..dec를 갖고 있으며 각각의 테이블에서 반복되는 위치에 locatin 및 actioncount 필드가 있습니다.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 

조인.

추가 : 입력란에 날짜 범위도 있습니다. 지금까지 나는 범위에서 달의 목록을 얻고 있으며 매월 분리 된 결과를 얻고 있습니다. 나는 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

월 열의 색인을 사용하면 모든 테이블에서 조인하는 것보다 훨씬 빠를 것입니다. 5 천만 명이 훌륭한 데이터베이스가 아닙니다. –

답변

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

당신은 모든 달을 seperat로 매핑해야하지만 hibernate는 기본 클래스를 쿼리 할 때 모든 상속 된 클래스를 쿼리해야하고 상속 된 클래스 (january, ...) 목록을 가져온다는 것을 알기에 충분히 똑똑합니다. 생성 된 sql은 조회와 유사해야합니다. 같은 인터페이스로 간다, 나는 비록 인터페이스가 매핑되어 있어야할지 모르겠다. – Firo

+0

나는 또한 수업 월이 추상적이어야한다는 몇 가지 관련 게시물을 읽었습니까? –

관련 문제