Terry.Li-彬

          虛其心,可解天下之問(wèn);專(zhuān)其心,可治天下之學(xué);靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評(píng)論 :: 0 Trackbacks

          準(zhǔn)備:

          兩個(gè)表(實(shí)體), 1對(duì)多雙向關(guān)聯(lián):

          班級(jí): Clazz (id, name)

          學(xué)生: Student(id, name , class_id)

          1. 查詢持久化對(duì)象  

          1.1 簡(jiǎn)單查詢,返回?cái)?shù)據(jù)庫(kù)結(jié)構(gòu)
          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();  

          特別注意:返回結(jié)果是Object[]組成的List,通過(guò)Object下標(biāo)訪問(wèn)屬性

          使用場(chǎng)合:非基于對(duì)象的查詢,復(fù)雜查詢

          1.2 簡(jiǎn)單查詢,返回持久化對(duì)象

            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對(duì)象的List 2. 查詢出來(lái)的持久態(tài)對(duì)象,clazz對(duì)象的studets屬性是各代理對(duì)象,訪問(wèn)的時(shí)候才會(huì)去查詢DB 使用場(chǎng)合:基于對(duì)象的查詢,但對(duì)象簡(jiǎn)單查詢

          1.3 多表查詢,返回多個(gè)實(shí)體
          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方法指定了當(dāng)前返回實(shí)體的別名,而且在SQL語(yǔ)句里使用{c.*}這樣的語(yǔ)句,  
          3. 它的意思是向別名為c的這個(gè)對(duì)象注入所有屬性值.  
          1. 2. 這個(gè)查詢會(huì)返回一個(gè)Object的List,每個(gè)Object包含兩個(gè)對(duì)象一個(gè)Clazz,一個(gè)Student  
          1. 3. {}占位符里是對(duì)象的屬性,而非列名,如{s.class},而非{s.class_id}  
          1. 4. 必須注入對(duì)象的每個(gè)屬性值,你可以使用{c.*},或者手工寫(xiě)全所有,但必須是所有屬性。(這個(gè)太讓我郁悶了。   
          1. 使用場(chǎng)合:基于對(duì)象的查詢,復(fù)雜查詢  

          1.4  多表查詢,返回關(guān)聯(lián)實(shí)體

          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>特別注意: 這塊有些問(wèn)題,明明應(yīng)該返回Clazz的List的,但確返回包含Clazz和Student的Object的List, faint</p><p>使用場(chǎng)合:基于對(duì)象的查詢,復(fù)雜查詢</p>  

          2. 查詢托管對(duì)象

          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. 如果不設(shè)置addScalar方法可能會(huì)報(bào)轉(zhuǎn)型錯(cuò)誤的異常.

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

          posted on 2008-09-04 17:35 禮物 閱讀(885) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Java
          主站蜘蛛池模板: 镇康县| 临武县| 灵武市| 隆安县| 盐亭县| 新乐市| 潜山县| 乐昌市| 棋牌| 虞城县| 长武县| 丰顺县| 恩施市| 荔浦县| 咸丰县| 罗山县| 中江县| 广东省| 张家界市| 泰顺县| 博客| 临漳县| 元江| 砚山县| 保亭| 莲花县| 北票市| 布尔津县| 工布江达县| 巴林右旗| 荔浦县| 宜兰市| 防城港市| 青田县| 碌曲县| 高青县| 广汉市| 阳高县| 平乐县| 阿拉尔市| 陈巴尔虎旗|