Другим подходом для этой ситуации (необходимость повторного использования одной и той же логики в запросах с различными критериями) может быть использование нестандартных замыканий, как вы указали в заголовке своего поста.
Ваш конкретный случай лучше разрешить с помощью свойства totalCount PagedResultList, так же как Дана разместила в своем ответе. Но вы можете прийти к более сложному сценарию, когда вам придется повторно использовать логику внутри критериев. Для аналогичной ситуации я успешно попробовал следующее решение. Используя ваш случай в качестве примера:
def iLikeLoginClosure = { builder ->
builder.ilike('login', '%test%')
}
[
userInstanceList: User.list(params) {
iLikeLoginClosure delegate
},
userInstanceTotal: User.count() {
iLikeLoginClosure delegate
}
]
Где builder in iLikeLoginClosure - это ссылка на объект построителя критериев, внутри которого вызывается замыкание. Кроме того, внутри iLikeLoginClosure вы можете использовать переменные с той же областью действия, что и в замыкании.
Это было вдохновлено этой статьей: http://mrhaki.blogspot.com.ar/2010/06/grails-goodness-refactoring-criteria.html из отличного блога MrHaki.