【问题标题】:Can Grails / GORM filter association results w/o N+1 queries?Grails / GORM 可以过滤没有 N+1 查询的关联结果吗?
【发布时间】:2012-10-10 14:43:57
【问题描述】:

我有一个遗留模式,其中在 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=?

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

【问题讨论】:

    标签: grails grails-orm has-many


    【解决方案1】:

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

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

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

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

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

    如果可以为 CompanyStaff 仅获取单个 CompRecord,则可以使用 HQL 获取包含 CompanyStaffCompRecord 字段的无类型集合。

    【讨论】:

    • 感谢您的回复——好主意。不幸的是,CompanyStaff 上缺少分页可能使我无法使用它。此外,我无法在此样式查询中使用“staff.lastName”进行排序。我必须将其转换为条件查询才能对父关联进行排序。
    • 您仍然可以使用 HQL 并获得无类型的结果集。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多