2014-12-24 66 views
0

我試圖創建一個HQL查詢,計算特定日期(例如,有多少登錄等)的特定用戶列表上的幾個統計信息。每個統計有不同的標準):HQL - 計數在SELECT子句不起作用

SELECT 
    COUNT(SELECT u2.id FROM User u2 WHERE u.id = u2.id AND u2.lastLoginDate BETWEEN x AND y), 
    COUNT(some other stats), ... 
FROM User u 
WHERE u.managerId IN (...) 

雖然COUNT(SELECT...)條款在MySQL工作,在HQL我得到以下異常: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: SELECT

任何人都知道如何使它發揮作用?

編輯: 好了,所以根據這個建議HQL - COUNT on SELECT clause not working現在查詢看起來是這樣的:

SELECT 
    COUNT(DISTINCT CASE WHEN u.lastLogin BETWEEN x AND y THEN u.id ELSE null END), 
    COUNT(DISTINCT CASE WHEN ... END), 
    SUM(CASE WHEN u.id = p.userId THEN p.amount ELSE null END), 
FROM User u, Points p,... WHERE u.managerId IN (...) 

問題是,計算的總和,因爲FROM子句不正確 - 它是由數乘以的表格。 例如,如果總數應該是80,並且在from子句中有4個表格,則總和爲480!

明顯地,不同的東西不能正確工作。有任何想法嗎?

+0

這是完全不同的問題。在任何情況下,只需遵循一條簡單的規則:不要在'from'子句中使用逗號。使用顯式連接,你會解決你的問題。 –

回答

1

看來你只是想要條件聚合。目前還不清楚是什麼你真的從查詢想要的,但是這可能是接近:

SELECT COUNT(*) as cnt1, 
     SUM(CASE WHEN u2.lastLoginDate BETWEEN x AND y THEN 1 ELSE 0 END) as cnt2, 
     SUM(CASE WHEN some other stats THEN 1 ELSE 0 END), ... 
FROM User u 
WHERE u.managerId IN (...) 

我感到意外的是count(select . . .)在MySQL工作。首先,子查詢通常需要自己的括號。其次,在select中,子查詢通常需要是標量子查詢。第三,通常不允許子查詢作爲聚合函數的參數。你確定這個結構不是select count() . . .

+0

謝謝,我會試試 所以,只是一個澄清 - 沒有在HQL中使用count(select ...)的方法?另外,如果我需要使用count來區分呢? – Ayelet

+1

我不確定HQL,但是我懷疑它的結構在SQL的其他方言中不可用。簡單的解決方案是在子查詢中進行聚合*,而不是將子查詢作爲聚合函數的參數。 –

+0

是的,它絕對在mysql中工作 – Ayelet

0

您可以使用原生SQL。 這裏是一個例子。

String sql = "select {user.*} from User user"; 
    // here creates a hql query from sql 
    SQLQuery query = session.createSQLQuery(sql); 
    query.addEntity("user", User.class); 
    List results = query.list(); 

    //Hibernate modifies the SQL and executes the following command against the database: 

    select User.id as id0_, User.name as name2_0_ from User user 

您可以搜索原生SQL。 希望這會有所幫助。

+0

請參閱我的編輯,問題不是'('但是請選擇 您建議的解決方案在我的情況下不起作用 – Ayelet