1

我有一个遗留模式,其中在 hasMany 关联的子端有有效的日期记录。在这种情况下,我希望从父对象的结果中排除结束日期的记录,并试图避免 N+1 查询解决方案。

我可以像这样过滤它们并生成一个适当的查询:

def companyStaffList = CompanyStaff.findAll ( [ max: params.max, sort: params.sort, order: params.order ] ) {
      companyID == params.id && 
      compRecords { effectiveDate < new Date() && endDate > new Date() }
}

生成的查询具有连接和过滤器:

        select [ ...the base fields + the associated fields... ] from company_staff 
    this_ inner join person_compensation comprecord1_ on 
    this_.personID=comprecord1_.personID where 
(this_.companyID=? and ((comprecord1_.effectiveDate<? and comprecord1_.endDate>?))) 
    order by this_.lName asc limit ?

不幸的是,一旦我开始访问关联的字段,我看到第二个查询不传播过滤条件:

select [ the associated fields ] from person_compensation 
comprecord0_ where comprecord0_.personID=?

请告知是否有原则性的方法可以做到这一点,或者我只是要求太多。

4

2 回答 2

1

您正在访问子集合compRecords,对吗?

然后第一个查询只获取那些CompRecord符合搜索条件的 s。

想象一下CompanyStaff staffA,有一个CompRecord适合搜索,而一个不适合。该数据不适合完全填写CompanyStaff.compRecords。然后您开始访问staffA.compRecords集合,您还需要枚举那些CompRecord不适合查询的 s。

为了避免 N+1 读取,我会查询 child CompRecord。但是你将无法对CompanyStaffs 进行分页,而只能对CompRecords 进行分页:

CompRecords.findAll ([max: params.max, sort: params.sort, order: params.order]) {
  effectiveDate < new Date() && endDate > new Date() &&
  staff {
    companyID == params.id
  }
}

如果只CompRecord为 a获取一个是可以的CompanyStaff,您可以使用 HQL 获取一个包含CompanyStaffCompRecord字段的无类型集合。

于 2012-10-11T09:13:38.950 回答
0

您可以使用 Eager fetching 来避免 N+1。查看GORM文档,其中讨论“使用 Eager Fetching 进行查询”

于 2012-10-11T07:25:58.943 回答