Сортировать по количеству ассоциаций в Grails - PullRequest
3 голосов
/ 06 апреля 2010

У меня есть много объектов темы, и у каждой темы есть много сообщений: сообщение Как я могу заказать все объекты Темы на основе их количества сообщений ??

Ответы [ 2 ]

7 голосов
/ 29 июня 2011

Вы можете сделать это одним HQL-запросом с помощью функции size (). Таким образом вы получаете экземпляры тем в одном запросе:

SELECT topic
FROM Topic topic
ORDER BY size(topic.posts)

Я нашел это в http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html, разделе 14.16 Советы и хитрости.

1 голос
/ 06 апреля 2010

Вы можете сделать это, но это требует двух запросов.Это связано с тем, что для упорядочения по размеру коллекции вам нужно использовать 'group by', но для этого необходимо перечислить все свойства вашей темы.Если вы добавите или удалите один, запрос будет прерван.Таким образом, решение состоит в том, чтобы запустить один запрос, который находит упорядоченные идентификаторы, и второй, который получает экземпляры для этих идентификаторов:

String hql = '''
SELECT t.id
FROM Topic t LEFT JOIN t.posts AS post
GROUP BY t.id
ORDER BY COUNT(post) DESC
'''
def ids = Topic.executeQuery(hql)
def orderedTopics = Topic.getAll(ids)
...