Я не уверен, что то, что вы намереваетесь, возможно (я даже не уверен, что вы должны быть в состоянии сделать это с необработанным SQL).
Вы хотите использовать оператор Group By
, который (в моем понимании) имеет значение только при использовании в сочетании с агрегатными функциями, но вы не используете агрегатную функцию. Я предполагаю, что ваша цель состоит в том, чтобы получить структуру данных, похожую на эту: [user_id_1: [t1, t5, t2], user_id_2: [t3, t4, t8]...]
(где tX - это экземпляр из Table
), это правильно?
Если это так, я думаю, вам просто нужно получить набор экземпляров, которые вам нужны, и организовать их самостоятельно:
def findMostRecentPerUser( Owner owner ) {
def someDate = new Date() - 5 // 5 Days ago
def result = [:].withDefault{[]}
Table.withCriteria {
eq('owner.id', owner.id)
gt('due_date', someDate)
order('due_date', 'desc')
}.each{result[it.user.id] << it}
return result
}
Однако, как вы можете видеть, это дает вам только экземпляры, которые произошли после некоторой даты (или, удаляя оператор gt
, он дает вам все экземпляры, что, вероятно, не то, что вы хотите). Вы можете ограничить его одним последним экземпляром для каждого пользователя, используя distinct('user.id')
Но если вы хотите, скажем, 5 самых последних экземпляров для каждого пользователя, я думаю, вы застряли бы, выполняя запрос для каждого пользователя (и, конечно, ограничив набор результатов 5). Мне очень интересно увидеть решение для этого случая, если у кого-то оно есть.