如何使用Hibernate中的group by和sum投影选择多个列

Sat*_*h N 1 hibernate group-by sum projection

我的MySQL查询是:

SELECT 
    c.first_name, 
    c.middle_name, 
    c.last_name, 
    s.ticker, 
    COUNT(s.ticker), 
    SUM(t.cumulative_qty), 
    SUM(cumulative_balance)
FROM client_master c, security s, transaction_master t 
WHERE c.id = t. client_master_id AND s.id = t.security_id AND t.client_master_id = 4 
GROUP BY t.security_id;
Run Code Online (Sandbox Code Playgroud)

此查询返回精确结果.我想编写具有匹配结果的Hibernate Criteria.这是我试过的:

Criteria criteria = createEntityCriteria(TransactionDetails.class, "tr")
                .createAlias("tr.client", "cl")
                .createAlias("tr.security", "se")
                .add(Restrictions.eq("cl.id", clientId))
                .setProjection(Projections.sum("tr.cumulativeQty"))
                .setProjection(Projections.groupProperty("tr.securityId"));

return  criteria.list();
Run Code Online (Sandbox Code Playgroud)

但这个标准是回归只是一个Listtr.securityId.我想要所有的行.我哪里错了?

bit*_*kot 5

你做不了setProjection()多次.您需要创建ProjectionList第一个然后设置每个投影.您还需要通过指定结果集中的条件来告诉您需要哪些字段Projections.property().

试试这个:

ProjectionList projList = Projections.projectionList();
projList.add(Projections.sum("tr.cumulativeQty"));
projList.add(Projections.groupProperty("tr.securityId"));

projList.add(Projections.property("firstName"));
projList.add(Projections.property("lastName"));
//add other fields you need in the projection list

Criteria criteria = createEntityCriteria(TransactionDetails.class, "tr")
                .createAlias("tr.client", "cl")
                .createAlias("tr.security", "se")
                .add(Restrictions.eq("cl.id", clientId))
                .setProjection(projList);
Run Code Online (Sandbox Code Playgroud)