1. 程式人生 > >hibernate中相關問題hql與sql的不同實現方式

hibernate中相關問題hql與sql的不同實現方式

如果我們想要的結果是某個物件的實體,這是就可以通過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();
如果我現在是多張表的聯合查詢,而且返回的又不是所有屬性,我們又想通過物件來接收,該怎麼做呢?
SELECT 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 =?)
這是專案中實際的 sql 語句 現在只需要得到三個統計值 tableFull testFull perfection
如果只是普通表的檢查查詢 可以用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語句進行查詢,createSQLQuerysql語句查詢;前者以hibernate生成的Bean為物件裝入list返回;後者則是以物件陣列進行儲存;

那麼setResultTransformer與addEntity的區別是什麼呢?一個區別是前者支援查任意的列,後者必須用select * from users的形式或select

{a.*},{b.*} from a,b where ....。