【问题标题】:Grails eager fetch with scrollingGrails 渴望通过滚动获取
【发布时间】:2023-03-09 05:20:01
【问题描述】:

我正在尝试滚动浏览 namedQuery 的结果集。为了避免 N=1 问题,我将 fetch param 设置为 eager。我也对不同的顶级对象集感兴趣。所以我的控制器闭包看起来像这样:

def list = {
        params.max = Math.min(params.max ? params.int('max') : 25, 50)
        params.fetch=[tasks:"eager"]
        def requests =    Request.activeOnly.open.listDistinct(params)
...
}

我看到的问题是查询返回的请求对象少于 25 个。相反,它返回 25 行联合结果集,这不是我想要的。我该如何重构它?顺便说一句,“选择”提取效果很好,但会产生 26 个查询。 谢谢, 德米特里。

【问题讨论】:

    标签: hibernate grails


    【解决方案1】:

    您不能将最大结果应用于对集合执行连接提取的查询,因为最大值应用于结果集中返回的行数,而不是实体数。

    在这种情况下,我要做的是第一个查询,它只获取根实体 (Request) 的 ID,然后是第二个查询,它使用 IN 子句选择具有获取集合的实体:

    // first query, with max results applied: returns 25 IDs
    select request.id from Request request where ...
    
    // second request:
    select request from Request request 
    left join fetch request.tasks 
    where request.id in (:setOfIdsReturnedByTheFirstQuery)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 2012-08-21
      • 2014-05-15
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多