如下是数据库中的客户信息,希望通过客户来源即custSource字段进行统计。
查询得到的结果如下,希望把结果存到map集合中。
public List countSource() {
Session session=this.getSessionFactory().getCurrentSession();
// String hql="select count(*),custSource from Customer group by custSource";
// Query query=session.createQuery(hql);
String sql="select custSource,count(*) num from t_customer group by custSource";
SQLQuery query=session.createSQLQuery(sql);
List list=query.setResultTransformer(Transformers.aliasToBean(HashMap.class)).list();
return list;
}
代码中分别通过hql语句和sql语句进行查询,但hql语句查询的结果为空,sql语句可以得到正确结果,我们先来看一下createQuery和createSQLQuery的区别:
前者用的hql语句进行查询,后者可以用sql语句查询
前者以hibernate生成的Bean为对象装入list返回
后者则是以对象数组进行存储
所以我感觉问题的原因在于:hql语句查询的list中,结果是以bean对象存储,不能转化为HashMap结构,所以转化后的结果为空。
对于createSQLQuery,有时候也想以hibernate生成的Bean为对象装入list返回,就不是很方便,但它有这样一个方法可以直接转换对象:
Query query = session.createSQLQuery(sql).addEntity(XXX.class);
XXX 代表以hibernate生成的Bean的对象,也就是数据表映射出的Bean。
另外:query.setResultTransformer(Transformers.aliasToBean(HashMap.class))
可以将结果以想要的结果存储。