【问题标题】:Applying pagination options to a one-to-many list in Grails将分页选项应用于 Grails 中的一对多列表
【发布时间】:2010-04-10 03:19:26
【问题描述】:

我有一个用户类 hasMany = [friends:User]

现在我正在尝试显示好友列表 - ${user.friends}

但是,我希望能够像我一样应用参数,例如 User.findAllBy(user, [max:10, sort: 'dateCreated', order: 'desc"])

谁能告诉我如何在 Grails / Groovy 中的一对多上执行此操作?

【问题讨论】:

    标签: grails groovy


    【解决方案1】:

    我会使用 HQL:

    String hql = '''
    select u from User u, User u2
    where u in elements(u2.friends) and u2=:user
    order by u.dateCreated desc
    '''
    int max = ...
    int offset = ...
    def friends = User.executeQuery(hql, [user: user], [max: max, offset: offset])
    

    您可以尝试过滤好友集合,但一旦您对它进行任何操作,它就会从数据库中完全加载,因此如果您只想要 10 个实例,那么您将浪费加载所有其余的实例。

    【讨论】:

    • 谢谢!那行得通——有没有一种方法可以包括总计数而不必执行另一个查询? -- 用于分页
    • 不行,你需要做两次查询,因为结果查询受到max和offset的限制,但count不能,它必须是总数。 Grails 使用一种返回 PagedResultList 的条件查询来模拟这一点,但在后台它只是为您运行这两个查询。
    【解决方案2】:

    我刚刚发现了 Grails 的 GORM Labs 插件,它提供了以下功能

    “对于每个“hasMany”属性,现在都有一个关联方法,该方法采用分页属性(“offset”和“max”)并生成适当的页面。还有一个“countBars”实例属性将提供总数"bars" 集合的大小。如果集合之前没有初始化,这一切都通过单独的数据库查询完成,因此您可以避免加载集合的所有元素"

    http://www.grails.org/plugin/gorm-labs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 2017-05-26
      相关资源
      最近更新 更多