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
          主站蜘蛛池模板: 安阳县| 旌德县| 巴彦淖尔市| 庆安县| 五寨县| 松潘县| 公安县| 苍山县| 德令哈市| 固始县| 永新县| 江安县| 弥勒县| 营山县| 北海市| 澄迈县| 晋江市| 凤阳县| 沽源县| 新河县| 拜城县| 墨竹工卡县| 丁青县| 章丘市| 咸阳市| 通许县| 西乌| 荆州市| 阜新市| 潼南县| 博客| 会昌县| 叙永县| 阿拉尔市| 竹溪县| 桂平市| 洛隆县| 华阴市| 六枝特区| 噶尔县| 永善县|