hibernate from子句中使用HQL的子查询

bjp0bcyl  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(246)

我有一个包含500k行的表articles。一篇文章包含作者列表。我试图创建一个查询来获取作者列表的最新发布文章。
我使用了下面的HQL查询,它可以得到我想要的结果,但是运行速度非常慢(大约4秒)

select author, article
            from Article article inner join article.authors author
            where (author.id, article.publishedAt) in 
            (select author.id, max(article.publishedAt) 
            from Article article join article.authors author
            where author.id in (authors_list))
            group by author.id

在普通SQL中,一个可能更好的查询是:

select * from (
                select articles.id, author.id
                from articles, article_authors, authors
                where articles.id = article_authors.article_id and 
                    article_authors.author_id=authors.id    
                    and author.id in (author_list)  
                    order by articles.publishedAt desc
              ) b
              group by authors.id;

但是Hibernate文档中指出,HQL子查询只能出现在select或where子句中。http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-subqueries
有没有一种方法可以使用HQL模拟这种查询,或者有没有其他方法可以增强查询的性能?

8e2ybdfx

8e2ybdfx1#

在这两种情况下,如果用于比较的数据很大,您都希望尝试将其隔离。在上面的第一个查询中,您具有:

in 
            (select author.id, max(article.publishedAt) 
            from Article article join article.authors author
            where author.id in (authors_list))

尝试先将该语句放入临时表中,然后使用该小数据集以提高效率。

select author.id, max(article.publishedAt) into #temp1
                from Article article join article.authors author
                where author.id in (authors_list))

 select author, article
            from Article article inner join article.authors author
            where (author.id, article.publishedAt) in 
            (select author.id, article.publishedAt 
            from #temp1)
            group by author.id

因为计算完成后数据集会变小,所以应该可以提高性能。

相关问题