使用 Group By 和 aliasToBean 的休眠条件查询

Posted

技术标签:

【中文标题】使用 Group By 和 aliasToBean 的休眠条件查询【英文标题】:Hibernate Criteria Query with Group By and aliasToBean 【发布时间】:2012-09-22 11:56:24 【问题描述】:

我有一个名为 SaleRecord 的表/实体,其中包含诸如

之类的字段
@Entity
public class SaleRecord 
   private Long id;
   private String type;
   private Double amount;
   //Getter and Setter and more fields

我想用 Criteria 写下面的查询

SELECT s.type AS accountName, SUM(s.amount) AS amount 
FROM salerecord s
GROUP BY s.type

我在 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();

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();

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;
         

【问题讨论】:

不工作是什么意思?抛出一些错误? 没有。也不例外,但结果列表为空。我认为它无法转换。如标准列名称为“类型”,但 CollectionDO.java 的字段为“帐户名称” 【参考方案1】:

我认为它无法转换。如标准列名称为“类型”,但 CollectionDO.java 的字段为“帐户名称”

尝试如下(使用这个版本的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();

【讨论】:

我认为它正在返回结果,但作为对象而不是作为 CollectionDO 对象。所以在迭代它时抛出异常 java.lang.ClassCastException: [Ljava.lang.Object;无法转换为 org.commission.controller.dashboard.CollectionDO 除了我在调用 setProjection 之后调用 setResultTransformer 之外,同样的事情对我有用,在我的代码中的情况类似。你想试一试吗? 我更新了关于如何在代码中添加投影和转换器类的答案。不确定你是否有机会看到。

以上是关于使用 Group By 和 aliasToBean 的休眠条件查询的主要内容,如果未能解决你的问题,请参考以下文章

聚合函数 和 group by

高级分组group by group by cube group by rollup 使用说明

sql中得group by 用法?

使用 group_by 和 summarise 时出现重复行

sql语句执行顺序之group by、order by

了解 dplyr 和 group_by