hibernate執行sql語句的總結

原文是:http://www.ityangba.com/thread-333-1-1.html

最近這幾天一直在玩hibernate,而且經常要在hibernate中執行SQL語句,所以在這記錄一下,以防備用1、如果要執行的sql語句是多表查詢,並且是返回一個對象。這個對象是配置hibernate映射的。這種是最簡單的了

下面看個示例:

public List<Menu> findMenusByEntityTypeId(Long id) { String hql = "select m.id as {menu.id},m.name as {menu.name},m.url as {menu.url},m.icon_url as {menu.iconUrl},m.parent_id as {menu.parentId}," +"m.serial_number as {menu.serialNo},m.admin as {menu.adminUse},m.system_admin as {menu.systemAdmin} ,m.program_name as {menu.programName}" +" from menu m, entity_type et, entity_admin_menu eam" +" where et.id = "+id+"" +" and m.program_name = '"+GlobalNames.PROGRAM_NAME_CHSS+"'" +" and et.id = eam.entity_id" +" and m.id = eam.menu_id"; List<Menu> menus = super.getSessionFactory().getCurrentSession().createSQLQuery(hql).addEntity("menu",Menu.class).list(); return menus; }


1.通過addEntity("menu",Menu.class),通過addEntity把要返回的數據強轉爲Menu,注意Menu必須要是配置hibernate映射了的。m.id as {menu.id},這是爲了如果數據庫字段名和Menu模型中不一樣所以都as取了個別名,那麼這樣就能返回menu對象了。

2、如果要執行的sql語句是多表查詢,並且是返回一個對象。但是這個對象是沒有配置hibernate映射的。這種就麻煩了。hibernate執行SQL默認返回的是一個object類型的數組,

List menus =super.getSessionFactory().getCurrentSession().createSQLQuery(hql).list();

for(int i=0;i<menus .size();i++)

{Object[] objects = (Object[])menus .get(i);for(int j=0;j<objects.length;j++)

{System.out.println(objects[j].getClass().getName());}

運行後報錯:java.lang.ClassCastExceptionjava.lang.Object; cannot be cast to net.greatsoft.chss.domain.privilege.model.Menu,原來是查詢出來的字段並不能自動轉換爲bean對象,所以要添加addEntity(Clazz class)。有人肯定會說添加addEntity了,但是如果Menu沒有添加hibernate映射的話,此時會報Menu unmapping。。。。。。就是沒添加映射,

所以只能添加setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); //返回一個map,KEY:爲DB中名稱一致(大小寫一致)遍歷list時就可以。所以只能將返回的值變成Map,這樣就好操作了,然後就可用反射取值了,詳細看:hibernate 執行sql語句返回自定義對象


3、hibernate 中createQuery與createSQLQuery兩者區別是:

前者用的hql語句進行查詢,後者可以用sql語句查詢

前者以hibernate生成的Bean爲對象裝入list返回,後者則是以對象數組進行存儲

所以使用createSQLQuery有時候也想以hibernate生成的Bean爲對象裝入list返回,就不是很方便

突然發現createSQLQuery有這樣一個方法可以直接轉換對象

Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);

XXXXXXX 代表以hibernate生成的Bean的對象,也就是數據表映射出的Bean。但是這個bean必須有映射

呵呵以後多注意,還是時不時的要看看hibernate各個對象方法的使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章