Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks

          準備:

          兩個表(實體), 1對多雙向關聯:

          班級: Clazz (id, name)

          學生: Student(id, name , class_id)

          1. 查詢持久化對象  

          1.1 簡單查詢,返回數據庫結構
          1. sql = "select c.* from clazz c,student s where s.class_id = c.id";     
          2.   
          3. List<Clazz> clazzs = (List<Clazz>)session.createSQLQuery(sql).list();  

          特別注意:返回結果是Object[]組成的List,通過Object下標訪問屬性

          使用場合:非基于對象的查詢,復雜查詢

          1.2 簡單查詢,返回持久化對象

            sql = "select c.* from Clazz c , student s where s.class_id = c.id ";    List<Clazz> clazzs = (List<Clazz>) session.createSQLQuery(sql).addEntity(Clazz.class).list();

          特別注意: 1.addEntity方法指定返回包含Clazz對象的List 2. 查詢出來的持久態對象,clazz對象的studets屬性是各代理對象,訪問的時候才會去查詢DB 使用場合:基于對象的查詢,但對象簡單查詢

          1.3 多表查詢,返回多個實體
          1. String sql = "select {c.*}, {s.*} from Clazz c , student s where s.class_id = c.id   ";  
          2.   
          3. List<Clazz> clazzs = (List<Clazz>) session().createSQLQuery(sql)  
          4.   
          5.                                  .addEntity("c", Clazz.class)  
          6.   
          7.                                  .addEntity("s", Student.class).list();  
          1. 特別注意:   
          2. 1. addEntity方法指定了當前返回實體的別名,而且在SQL語句里使用{c.*}這樣的語句,  
          3. 它的意思是向別名為c的這個對象注入所有屬性值.  
          1. 2. 這個查詢會返回一個Object的List,每個Object包含兩個對象一個Clazz,一個Student  
          1. 3. {}占位符里是對象的屬性,而非列名,如{s.class},而非{s.class_id}  
          1. 4. 必須注入對象的每個屬性值,你可以使用{c.*},或者手工寫全所有,但必須是所有屬性。(這個太讓我郁悶了。   
          1. 使用場合:基于對象的查詢,復雜查詢  

          1.4  多表查詢,返回關聯實體

          1. String sql = "select {c.*}, {s.*} from Clazz c , student s where s.class_id = c.id   ";  
          2.   
          3. List<Clazz> clazzs = (List<Clazz>) session().createSQLQuery(sql)  
          4.   
          5.         .addEntity("c", Clazz.class)  
          6.   
          7.         .addJoin("s", "c.students").list();  
          1. <p>特別注意: 這塊有些問題,明明應該返回Clazz的List的,但確返回包含Clazz和Student的Object的List, faint</p><p>使用場合:基于對象的查詢,復雜查詢</p>  

          2. 查詢托管對象

          1. String sql = "select c.id, c.name from Clazz c , student s where s.class_id = c.id   ";     
          2.   
          3. List<Clazz> clazzs = (List<Clazz>) session.createSQLQuery(sql)        
          4.   
          5.                                      .addScalar("id", Hibernate.LONG)  
          6.   
          7.                                      .addScalar("name", Hibernate.STRING)       
          8.   
          9.                                      .setResultTransformer(Transformers.aliasToBean(Clazz.class)).list();  

          特別注意:

          1. 如果不設置addScalar方法可能會報轉型錯誤的異常.

          2.托管查詢可以使用投影,只查詢指定的列屬性

          posted on 2008-09-04 17:35 禮物 閱讀(880) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 安徽省| 民乐县| 大厂| 乐亭县| 大洼县| 芮城县| 赤水市| 华坪县| 荣昌县| 恩施市| 揭东县| 揭阳市| 东明县| 峡江县| 嘉善县| 大名县| 滦平县| 临泽县| 通城县| 赣州市| 和龙市| 晋中市| 礼泉县| 安远县| 安塞县| 东阳市| 永仁县| 姜堰市| 阿瓦提县| 醴陵市| 博乐市| 阜南县| 新丰县| 新宾| 铜山县| 丰城市| 砀山县| 阳东县| 沅江市| 桂东县| 定南县|