Самый простой и эффективный способ добиться этого - использовать простой SQL. Если у вас есть эти таблицы
users [id]
goals [id, description]
user_goals [user_id, goal_id]
У вас может быть следующий запрос, чтобы сделать то, что вам нужно:
set @userId=123;
select user_id, count(*) as matched from user_goals
where user_id!=@userId
and goal_id in (select ug.goal_id from user_goals ug where ug.user_id=@userId)
group by user_id order by matched desc limit 5;
Принимает идентификатор пользователя и возвращает список других пользователей с совпадающими целями, отсортированный по количеству совпадений. Заверните это в GoalService
и все готово!
class GoalService {
def findUsersWithSimilarGoals(user) {
// ...
}
}
Также возможно сделать это с помощью критериев или HQL, но с такими запросами обычно проще использовать SQL.