我正在尝试滚动一个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个Request对象。相反,它返回25行的联合结果集,这不是我想要的。我该如何重组呢?顺便说一下,“select”fetch工作得很好,但会产生26个查询。 谢谢, 梅德。
答案 0 :(得分:2)
您不能将max结果应用于对集合执行连接提取的查询,因为max应用于结果集中返回的行数,而不是实体数。
在这种情况下,我所做的是第一个查询,它只获取根实体的ID(Request
),然后是第二个查询,它使用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)