1. 程式人生 > >Hibernate中createQuery與createSQLQuery的區別

Hibernate中createQuery與createSQLQuery的區別

前者用的hql語句進行查詢,後者可以用sql語句查詢. 前者以Hibernate生成的Bean為物件裝入list返回,hql是Hibernate實現的比較oo的sql語句. 後者則是以物件陣列進行儲存,如果查詢的記錄屬性沒能封裝成物件,則可以用物件陣列來取.

原來的查詢語句:

String sql = "select a.* from tb_doc_catalog a where a.cat_code like '"+catCode+"%'";   Session session = this.getSession();   try {    List catNameList = session.createSQLQuery(sql).list();    return catNameList ;   } finally {    releaseSession(session); //釋放session   } 分析:原來是查詢出來的欄位並不能自動轉換為bean物件。   解決思路一(採用hql查詢):  String sql = "select a from DocCatalogInfo a where a.catCode like '"+catCode+"%'";      List catNameList =getHibernateTemplate().find(sql);      return catNameList ; ok,測試一下發現沒問題,看來還是因為用原生sql查詢的原因,網上搜一下:createsqlQuery返回物件,看到一篇文章才覺悟到:    解決思路二(採用原生sql查詢):    String sql = "select a.* from tb_doc_catalog a where a.cat_code like '"+catCode+"%'";    Session session = this.getSession();    try {     List catNameList = session.createSQLQuery(sql).addEntity(DocCatalogInfo.class).list();     return catNameList ;    } finally {     releaseSession(session); //釋放session    } 又ok了。 該篇文章也貼上來: 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應用中應當注意。