我正在尝试创建一个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!
不经意的是,明显的胜利对于总和来说是正确的。有什么想法吗?
答案 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。 希望这会有所帮助。