使用迭代gorm-querys聚合的grails分页

使用迭代gorm-querys聚合的grails分页,grails,groovy,gorm,offset,paginate,Grails,Groovy,Gorm,Offset,Paginate,我有一个controller.method,为gsp中的分页提供与具有正确偏移量和最大值的概要文件相关联的所有内容 if (profil) { def max = params.max ? params.max as int : 5 def offset = params.offset ? params.offset as int : 0 List things = [] things = Things.findAllBy

我有一个controller.method,为gsp中的分页提供与具有正确偏移量和最大值的概要文件相关联的所有内容

    if (profil) {
        def max = params.max ? params.max as int : 5
        def offset = params.offset ? params.offset as int : 0
        List things = []

        things = Things.findAllByProfil(profil,[max: max, offset: offset, sort: 'dtCreated', order: 'desc'])
        [profil: profil, things: things, thingsCount: things.size()]
    }
但现在我有了一个特殊的“聚合配置文件”,其中有一些相关的配置文件,我想把所有相关配置文件的所有内容放在一个列表中,如:

    if (profil) {
        def max = params.max ? params.max as int : 5
        def offset = params.offset ? params.offset as int : 0
        List things = []

        if(profil.typ == 'Aggregate'){
            List profiles = profil.profiles?.collect { Profil.collection.findOne(_id:it.id) }
            profiles.each() { pr ->
                if(pr) {
                    things+= Things.findAllByProfil(pr as Profil,[max: max,offset: offset,  sort: 'dtCreated', order: 'desc']) 
                }
            } 
            things.sort{a,b-> b.dtCreated<=>a.dtCreated}
        }else{

            things = Things.findAllByProfil(profil,[max: max, offset: offset, sort: 'dtCreated', order: 'desc'])
        }
        [profil: profil, things: things, thingsCount: things.size()]
    }
if(profil){
def max=params.max?params.max as int:5
def offset=params.offset?params.offset作为int:0
列出事物=[]
如果(profil.typ==“聚合”){
List profiles=profil.profiles?.collect{profil.collection.findOne(_id:it.id)}
profiles.each(){pr->
国际单项体育联合会(公共关系){
things+=things.findAllByProfil(pr为Profil,[max:max,offset:offset,sort:'dtCreated',order:'desc']))
}
} 
things.sort{a,b->b.dtCreateda.dtCreated}
}否则{
things=things.findAllByProfil(profile,[max:max,offset:offset,sort:'dtCreated',order:'desc']))
}
[profil:profil,things:thingsCount:things.size()]
}
但是这样,对于每个相关的配置文件,我会多次使用
偏移量
最大值
,因此结果列表太大

不幸的是,结果设计应该保持不变,因此
assert params.max==5&&profil.typ==“Aggregate”
,第一页的结果是一个列表,其中包含所有概要文件中的5个最新内容(因为我将它们都放在一个列表中,并按创建的DTS对它们进行排序),我的问题可能是:如何将相同的切片逻辑应用于聚合列表(以及如何以性能的方式聚合这些内容)

解决这个问题的最佳方法是什么


对于任何提示,请提前感谢

我认为这取决于您希望在视图上显示结果的方式。在聚合模式下,您对每个配置文件的内容数有分页逻辑,但我猜乘以结果的是相关配置文件的数量。因此,您需要对该数量使用某种分页关联配置文件的r

这就是为什么我问你想如何显示你的结果,因为这应该推动设计

假设您处于聚合模式。 假设您有一个显示所有聚合配置文件的屏幕,到目前为止,您需要一个分页,而您目前没有,那么如果用户单击每个配置文件向他们显示结果,则需要另一个分页机制,您已经有了

同样,根据您的设计,您可能希望将配置文件列表与其内容列表分开。使用不同的操作来切片(分页)您的结果。在聚合模式下的当前设计中,问题是
Things.size()==Profiles.count*max
,您现在无法控制配置文件的大小


希望这有帮助

我认为这很大程度上取决于您希望在视图上显示结果的方式。在聚合模式下,您对每个配置文件的内容数有分页逻辑,但我猜乘以结果的是相关配置文件的数量。因此,您需要对相关配置文件的数量使用某种分页d个人资料

这就是为什么我问你想如何显示你的结果,因为这应该推动设计

假设您处于聚合模式。 假设您有一个显示所有聚合配置文件的屏幕,到目前为止,您需要一个分页,而您目前没有,那么如果用户单击每个配置文件向他们显示结果,则需要另一个分页机制,您已经有了

同样,根据您的设计,您可能希望将配置文件列表与其内容列表分开。使用不同的操作来切片(分页)您的结果。在聚合模式下的当前设计中,问题是
Things.size()==Profiles.count*max
,您现在无法控制配置文件的大小


希望这对您有所帮助,我认为理想情况下,您应该希望使用条件生成器、HQL或SQL或这些组合来表示查询中的
profil.typ==“Aggregate”
位,这意味着您让数据库而不是应用程序来完成工作。这也意味着
max
offset
将不起作用对


我不知道你的模型是什么样子的,但我认为你可以通过在
sqlRestriction
块中使用SQL子选择来做你想做的事情。很难在网上找到非平凡的例子,但文档会让你开始学习。

我认为理想情况下,你应该表达你的查询中的
profil.typ='Aggregate'
部分使用标准生成器、HQL、SQL或它们的组合表示您让数据库而不是应用程序来完成工作。这也意味着
max
偏移量
将正常工作


我不知道你的模型是什么样子的,但我认为你可以通过在
sqlRestriction
块中使用SQL子选择来做你想做的事情。很难在网上找到非平凡的例子,但这些文档会让你开始学习。

首先,我想扩展一下rcgeorge23所说的,让gorm/数据库处理您的聚合。这将花费您很长的时间

在您的特定情况下,只需将内置比较器与`findAllBy一起使用即可处理聚合,下面是一个具体示例:

if(profil.typ == 'Aggregate'){
  List profiles = //some code to get a list of profiles
  def things = Things.findAllByProfilInList(profiles, [max: max....order: 'desc'])
} else {
  ...
}    
第二,分页的使用有点不当。ThingScont技术上应该是一个简单的“选择计数”来匹配您的条件,但您返回的匹配条件受“max”的限制。因此,ThingScont使用以下内容

def thingsCount = Things.countByProfilInList(profiles) //for all things with aProfile in list
 or
def thingsCount = Things.countByProfil(aProfile) //for all things with aProfile

首先,我想扩展一下rcgeorge23所说的,让gorm/数据库来处理聚合确实是更好的选择。这会让你走很长的路

在您的特定情况下,您可以简单地使用内置的