2015-03-24 60 views
0

我正在使用Grails 2.3.6應用程序。此應用程序有多個域類,任務是根據用戶提供的日期範圍在域類中查找屬性。根據日期範圍查找Domain類上的屬性

我必須瀏覽多個Domain類才能找到此屬性,這就是我的棘手之處!下面

請參閱代碼:

class GlobalAllSiteData { 
    String globalSiteID = "" 

    static hasMany = [siteDatas: SiteData] 
} 

class SiteData { 
    static hasMany = [userDatas: UserData] 

    static belongsTo = [gd:GlobalAllSiteData] 
} 

class UserData { 
    static hasMany = [userActions: UserAction] 

    static belongsTo = [sd:SiteData] 
} 

class UserAction { 
    Date userAddedDate; 
    String userStatus = ""; // OK, INACTIVE, REMOVED 
    static belongsTo = [ud:UserData] 
} 

的3個參數用戶給出該應用是GlobalAllSiteData作爲字符串和2周的日期,這將在userAddedDate

下面被用作範圍是我設想的步驟:

  1. 查找所有SiteDat一個基於的對象GlobalAllSiteData字符串由用戶提供。

  2. 在每個SiteData對象中,循環遍歷以獲取所有UserData對象。

  3. 在每個UserData對象上循環遍歷以獲取所有UserAction對象。

  4. 在每個UserAction對象上,應用FROM & TO日期範圍並查找UserData對象的數量。

根據用戶被添加到公司列表的不同系統中的次數,每個用戶將有多個UserAction對象。

這是一個棘手的部分。所以爲了使它更容易,我想選擇userAddedDate那更接近今天的日期。然後將其與用戶提供的日期範圍進行比較。

所以,我應該根據用戶提供的日期範圍的最終輸出是,

  1. 在數據庫中的UserData的總數。

  2. 的UserData總數與UserActionuserStatus設置爲OK

由於我們對Grails和Groovy都很陌生,所以我對此一無所知!

有沒有更快更有效的方法來查詢上述條件?

回答

1

這取決於您存儲數據的位置。如果它是一堆文本文件,那麼循環這將是一個緩慢而合理的方法。如果它在數據庫中,那麼拉入幾個表的大部分子集並循環和過濾客戶端將不太好。壞的。瘋。相反

String globalSiteID = ... 
Date lower = ... 
Date upper = ... 

,使用數據庫做過濾你,例如:

試試這個

def userDatas = UserAction.createCriteria().listDistinct { 
    between 'userAddedDate', lower, upper 
    ud { 
     sd { 
     gd { 
      eq 'globalSiteID', globalSiteID 
     } 
     } 
    } 
    eq 'userStatus', 'OK' 
    projections { 
     property 'ud' 
    } 
} 

int userDataCount = UserAction.createCriteria().get { 
    between 'userAddedDate', lower, upper 
    ud { 
     sd { 
     gd { 
      eq 'globalSiteID', globalSiteID 
     } 
     } 
    } 
    projections { 
     countDistinct 'ud' 
    } 
}