我正在使用Grails 2.3.6应用程序。此应用程序有多个Domain类,任务是根据用户提供的Date范围在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
中的范围以下是我想象的步骤:
根据用户提供的 GlobalAllSiteData 字符串查找所有SiteData对象。
在每个SiteData对象中,循环访问以获取所有UserData对象。
在每个UserData对象上,循环访问以获取所有UserAction对象。
在每个UserAction对象上,应用FROM&到日期范围并找到UserData对象的数量。
每个用户都会有多个UserAction对象,具体取决于用户被添加到公司列表的不同系统的次数。
这是棘手的部分。因此,为了使其更容易,我想选择更接近今天日期的 userAddedDate 。然后将其与用户提供的日期范围进行比较。
因此,根据用户提供的日期范围,我应该拥有的最终输出是
数据库中的用户数据总数。
将 UserAction userStatus 设置为确定的 UserData 总数。
作为Grails和Groovy的新手,我对这个想法已经不多了!
是否有更快捷有效的方法来查询上述情况?
答案 0 :(得分: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'
}
}