У меня много запросов с одинаковой логикой, и я решил извлечь их в замыкание.
Вот пример:
Closure whereByProjectIdAndUser = { Criteria cr, Long projectId, User user ->
Long userId = user.id
Boolean isReviewer = user.isReviewer()
cr.isNull 'project.deletedAt'
cr.eq 'project.id', projectId
(cr | {
cr.eq 'owner.id', userId
if (isReviewer) {
cr & {
cr.eq 'reviewer.id', userId
cr.ne 'project.certificationStatus', ProjectCertificationStatus.None
}
}
})
}
@Transactional(readOnly = true)
RrmUtilization[] getAllByProjectIdAndUser(Long projectId, User user) {
BuildableCriteria cr = RrmUtilization.createCriteria()
RrmUtilization[] result = cr.list {
createAlias('project', 'project', JoinType.INNER_JOIN)
createAlias('project.owner', 'owner', JoinType.INNER_JOIN)
createAlias('project.reviewer', 'reviewer', JoinType.LEFT_OUTER_JOIN)
isNull 'deletedAt'
whereByProjectIdAndUser(cr, projectId, user)
} as RrmUtilization[]
result
}
Это работает просто отлично, однако я былпытаясь понять, как я могу избежать явной передачи BuildableCriteria в замыкание?Есть ли способ, чтобы неявно пройти через него и получить более приятный код?
Может быть, есть какие-то лучшие подходы в целом?