hibernate中相關問題hql與sql的不同實現方式
阿新 • • 發佈:2018-12-31
如果我們想要的結果是某個物件的實體,這是就可以通過addEntity()方法來實現。addEntity()方法可以講結果轉換為實體。但是在轉換的過程中要注意幾個問題:
1、查詢返回的是某個資料表的全部資料列
2、該資料表有對應的持久化類對映 vo類都不行
這時才可以通過addEntity()方法將查詢結果轉換成實體。
session.createSQLQuery("select * from perons_inf").addEntity(Person.class).list; session.createSQLQuery("select id,name,age from person_inf").addEntity(Person.class).list();
如果我現在是多張表的聯合查詢,而且返回的又不是所有屬性,我們又想通過物件來接收,該怎麼做呢?
這是專案中實際的 sql 語句 現在只需要得到三個統計值 tableFull testFull perfectionSELECT sum(t.tableFull) as tableFull,sum(t.testFull) as testFull,SUM(t.testFull)/SUM(t.tableFull) as perfection FROM T_CK_CHECKTABLE t where t.projId =? and t.menuId IN (SELECT s.ID from T_APP_SYSMENU s, R_APP_CHECKMENU k where s.ID = k.MENUID and s.PARENTIDS LIKE ? and s.SYSTEM ='1' and s.MENUTYPE ='0' and s.DELFLAG='0' and k.CHECKID =?)
如果只是普通表的檢查查詢 可以用hql解決 但是因為有中間表的存在(不存在實體類) 所以不用用hql 語句 也不能這樣寫:
Query query = getSession().createSQLQuery(sql).addEntity(Sysmenu.class);
因為這樣些的一個前提是 Sysmenu是該專案的一個實體 有主鍵 如果建立中間表的實體參與查詢會報:該實體沒有主鍵的錯誤
經查閱資料發現:setResultTransformer可以用於將資料庫查詢到的資料打包成臨時的包裝類,結合EL表示式來展示
修改之後的程式碼:
sql實現:
Query query = getSession().createSQLQuery(sql)
.addScalar("tableFull", StandardBasicTypes.DOUBLE)
.addScalar("testFull", StandardBasicTypes.DOUBLE)
.addScalar("perfection", StandardBasicTypes.DOUBLE)
.setResultTransformer(Transformers.aliasToBean(CheckResultVo.class));
hql 實現:
Query query = session.createQuery("select id , account , password from User")
.setResultTransformer(new AliasToBeanResultTransformer(vo.class))
hql實現和sql實現還是有點區別的
說明:createQuery用的hql語句進行查詢,createSQLQuery用sql語句查詢;前者以hibernate生成的Bean為物件裝入list返回;後者則是以物件陣列進行儲存;
那麼setResultTransformer與addEntity的區別是什麼呢?一個區別是前者支援查任意的列,後者必須用select * from users的形式或select
{a.*},{b.*} from a,b where ....。