使用 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 cube group by rollup 使用说明