1. 程式人生 > >Hibernate執行sql語句 返回可遍歷list

Hibernate執行sql語句 返回可遍歷list

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各個物件方法的使用。

還有另外一個相關的小細節應注意:
比如有這樣一個po
PO: User.class
properties: userId,userName
DDL: 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應用中應當注意。