HQL - SELECT子句上的COUNT不起作用

时间:2014-12-24 11:19:36

标签: java mysql hql spring-data

我正在尝试创建一个HQL查询,该查询计算特定用户列表中特定日期的几个统计信息(例如,登录了多少个等)。每个统计数据都有不同的标准):

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子句,计算的SUM不正确 - 它乘以表的数量。 例如,如果总和应该是80,并且我在from子句中有4个表,那么总和就是480!

不经意的是,明显的胜利对于总和来说是正确的。有什么想法吗?

2 个答案:

答案 0 :(得分: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() . . .吗?

答案 1 :(得分: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

您可以搜索Native SQL。 希望这会有所帮助。