Hibernate執行sql語句

Hibernate執行sql語句
BasicServiceImpl basicServiceImpl = new BasicServiceImpl();
String hql = "select * from AccountInfo where selfId='0000100003' or(left(selfId,10)='0000100004' and 

nodeSum=0)";

TManager tManager = TManagerImpl.getInstance();
List accountList = tManager.getSession().createSQLQuery(hql).list();
//List accountList = tManager.getSession().createSQLQuery(hql).addEntity(AccountInfo.class).list();
for(int i=0;i<accountList.size();i++){
Object[] objects = (Object[])accountList.get(i);
for(int j=0;j<objects.length;j++){
System.out.println(objects[j].getClass().getName());// 從這個輸出結果能夠看出,objects[j]的

值其實是AccountInfo的屬性(表的字段)而不是AccountInfo對象,
}
System.out.println(objects.length);
}
信息: java.lang.ClassCastException:Ljava.lang.Object; cannot be cast to net.yjiasoft.sss.table.AccountInfo
分析:原來是查詢出來的字段並不能自動轉換爲bean對象,因此要添加addEntity(Clazz class)。
擴展
1.SQL返回一個Map對象,也就是說在在list裏包含多個Map,代碼以下
Query query = session.createSQLQuery("select id,name from Tree t where pid in (select id from Tree) ").setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); //返回一個map,KEY:爲DB中名稱一致(大小寫一致)遍歷list時就能夠

Map map = (Map)list.get[i];

map.get("id");map.get("name");來取值。按你的SQL語句select後的字段名來做爲map的Key,但這個key必須與數據庫中的字段名如出一轍。


2.能夠用做函數方面的。如
Query query = session.createSQLQuery("select sum(id) SUMID from Tree t where pid in (select id from Tree)
.addScalar("SUMID",Hibernate.INTEGER)  //轉換類型,按DB中的type轉
.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); //返回一個map,KEY:爲DB中名稱一致(大小寫一致)

直接就map.get("SUMID")能夠取值了


還有一點就是這個方法在Hibernate3.2版本上才能正常運行。
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。呵呵之後多注意,仍是時不時的要看看hibernate各個對象方法的使用。還有另一個相關的小細節應注意:好比有這樣一個poPO: User.classproperties: userId,userNameDDL: create table tuser (userid varchar(10),username varchar(20));當執行:session.createQuery("from User u").list()時生成的SQL:select userid,username from tuser;當執行:session.createQuery("from User u").iterator()時生成的SQL:select userid from tuser;能夠看出list()一次將數據從數據庫中讀出直接填充到List中iterator()將數據的主鍵從數據庫中讀出,當循環這個Iterator時才添加執行:select userid,username from user where userid=?;把數據讀出。在不一樣的應用範圍使用不一樣的方法,具體在hibernate應用中應當注意
相關文章
相關標籤/搜索