Sort by association count in Grails

前端 未结 2 1786
感动是毒
感动是毒 2021-01-14 05:07

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

相关标签:
2条回答
  • 2021-01-14 05:31

    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)
    
    0 讨论(0)
  • 2021-01-14 05:34

    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.

    0 讨论(0)
提交回复
热议问题