根据日期范围在Domain类上查找属性

时间:2015-03-24 23:46:27

标签: grails gorm

我正在使用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

中的范围

以下是我想象的步骤:

  1. 根据用户提供的 GlobalAllSiteData 字符串查找所有SiteData对象。

  2. 在每个SiteData对象中,循环访问以获取所有UserData对象。

  3. 在每个UserData对象上,循环访问以获取所有UserAction对象。

  4. 在每个UserAction对象上,应用FROM&到日期范围并找到UserData对象的数量。

  5. 每个用户都会有多个UserAction对象,具体取决于用户被添加到公司列表的不同系统的次数。

    这是棘手的部分。因此,为了使其更容易,我想选择更接近今天日期的 userAddedDate 。然后将其与用户提供的日期范围进行比较。

    因此,根据用户提供的日期范围,我应该拥有的最终输出是

    1. 数据库中的用户数据总数

    2. UserAction userStatus 设置为确定 UserData 总数。

    3. 作为Grails和Groovy的新手,我对这个想法已经不多了!

      是否有更快捷有效的方法来查询上述情况?

1 个答案:

答案 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'
   }
}