1. 程式人生 > >Hibernate中createQuery與createSQLQuery兩者的使用區別

Hibernate中createQuery與createSQLQuery兩者的使用區別

如下是資料庫中的客戶資訊,希望通過客戶來源即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))
可以將結果以想要的結果儲存。