gpt4 book ai didi

grails - Grails/GORM是否可以在不执行N + 1查询的情况下过滤关联结果?

转载 作者:行者123 更新时间:2023-12-02 14:45:23 24 4
gpt4 key购买 nike

我有一个旧模式,在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=?

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

最佳答案

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

然后,第一个查询仅提取符合搜索条件的CompRecord

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

为了避免N + 1次读取,我将查询子CompRecord。但是,那么您将无法分页CompanyStaff,而只能分页CompRecord:

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

如果只为 CompRecord提取一个 CompanyStaff是可以的,则可以使用HQL来获取同时包含 CompanyStaffCompRecord字段的未类型化集合。

关于grails - Grails/GORM是否可以在不执行N + 1查询的情况下过滤关联结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12822149/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com