Sort by association count in Grails

2019-01-26 18:55发布

I have many Topic objects and each Topic hasMany posts:Post How can I order all Topic objects based on their posts count??

标签: grails gorm
2条回答
太酷不给撩
2楼-- · 2019-01-26 19:48

You can do it, but it requires two queries. This is because to order by the size of a collection, you need to use a 'group by' but this requires that you enumerate all of your Topic properties. If you add or remove one the query will break. So the solution is to run one query that finds ordered ids, and a second that gets the instances for those ids:

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)
查看更多
我欲成王,谁敢阻挡
3楼-- · 2019-01-26 19:59

You can do it in one HQL query with size() function. This way you get Topic instances in one query:

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

I've found this on http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html, section 14.16 Tips & Tricks.

查看更多
登录 后发表回答