Hibernate Criteria Query with Group By和aliasToBean

Rah*_*wal 6 java hibernate

我有一个名为SaleRecord的表/实体,其字段如

@Entity
public class SaleRecord {
   private Long id;
   private String type;
   private Double amount;
   //Getter and Setter and more fields
}
Run Code Online (Sandbox Code Playgroud)

我想用Criteria写下面的查询

SELECT s.type AS accountName, SUM(s.amount) AS amount 
FROM salerecord s
GROUP BY s.type
Run Code Online (Sandbox Code Playgroud)

我在Hibernate中使用纯SQL编写(其工作)

String sql = " SELECT s.type AS accountName, SUM(s.amount) AS amount ";
            sql += " FROM salerecord s ";
            sql += " GROUP BY s.type ";

List<CollectionDO> incomeList = (List<CollectionDO>) getSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(CollectionDO.class)).list();
Run Code Online (Sandbox Code Playgroud)

CollectionDO是另一个POJO类,我想在其中填充结果.

但是想要使用标准编写,那么如何编写此查询并将结果转换为CollectionDO类.我试过以下但没有工作

Criteria criteria = getSession().createCriteria(SaleRecord.class).setResultTransformer(Transformers.aliasToBean(CollectionDO.class));
        criteria.setProjection(Projections.property("type"));
        criteria.setProjection(Projections.sum("amount"));        
        criteria.setProjection(Projections.groupProperty("type"));
        return (List<CollectionDO>) criteria.list();
Run Code Online (Sandbox Code Playgroud)

CollectionDO.java

public class CollectionDO {    
    private Double amount;    
    private String accountName;

    public String getAccountName() {
        return accountName;
    }
    public void setAccountName(String accountName) {
        this.accountName = accountName;
    }
    public Double getAmount() {
        return amount;
    }
    public void setAmount(Double amount) {
        this.amount = amount;
    }     
}
Run Code Online (Sandbox Code Playgroud)

Vik*_*dor 12

我认为它无法改变.在Criteria列名称中是"type"但CollectionDO.java的字段为"accountName"

尝试如下(使用此版本的add来指定别名):

Criteria criteria = 
    getSession()
        .createCriteria(SaleRecord.class)
        .add(Restrictions.between("date", 
                                  reportForm.getFromDate(), 
                                  reportForm.getToDate()));

        .setProjection(Projections.projectionList()
            .add(Projections.property("type"), "accountName")
            .add(Projections.sum("amount"))
            .add(Projections.groupProperty("type")));
        .setResultTransformer(Transformers.aliasToBean(CollectionDO.class))
return (List<CollectionDO>) criteria.list();
Run Code Online (Sandbox Code Playgroud)