2011-06-29 29 views
0

在包含用戶,帖子和消息的自定義博客平臺中。 我知道如何做一個具有不同用戶和他們的發佈計數的HQL查詢。也不同的用戶和他們的消息數量。Hibernate HQL Query Subselects or Joins

但是,如果我將兩者結合起來使用「內連接」技術,我可以獲得相同的帖子和消息數。我明白爲什麼這是因爲加入而發生的。我怎麼能在HQL中進行子選擇以分別得到兩個計數,但是作爲一次數據庫訪問?

這是我試過的最後一個HQL查詢的一個例子。

select u.username, count(m), count(p) from User as u 
    inner join u.Messages as m 
    inner join u.Posts as p 
    group by u.id 
    order by count(m) desc 

注意:我將根據網頁上的選項更改訂單。

+1

看看hibernate投影在某些時候處理這​​樣的事情。此外,我不確定HQL是否會讓你這樣做,但你可以像標準的SQL一樣執行'count(distinct m.id)'和'count(distinct p.id)'。 –

+0

是的,我不得不多花一些時間看看投影。來一個C#LINQ背景我仍然試圖圍繞在LINQ和Hibernate中投影的區別。 +1的想法 – BuddyJoe

回答

3
select u.username, 
     (select count(m.id) from Message m where m.user = u) as messageCount, 
     (select count(p.id) from Post p where p.user = u) as postCount 
from User u 
order by messageCount desc 

您可能必須由順序問題,因爲這應該是固定的,但似乎並沒有在我的版本的Hibernate的錯誤http://opensource.atlassian.com/projects/hibernate/browse/HHH-892。如果是這種情況,請用order by 2代替order by messageCount

但是,正如邁克爾·李表示,你也可以使用一個簡單的加入和重複計數,這應該是更高效:

select u.username, count(distinct m.id), count(distinct p.id) from User u 
inner join u.messages m 
inner join u.posts p 
group by u.username) 
order by (count(distinct m.id) desc 

使用左連接的內部聯接,而不是也會讓你得到用戶沒有任何帖子或沒有任何消息。

+0

嗯。在這裏遇到的一個問題是,無論我使用messageCount或2,SQL中都不會生成ORDER BY。 – BuddyJoe

+0

拿回來有一個錯字。解決方法起作用。 +1並回答。 – BuddyJoe