Rory's Blog
          Happy study,Happy work,Happy life
          posts - 22,  comments - 46,  trackbacks - 0
          現(xiàn)在的系統(tǒng)中雖然使用了。Hibernate但是沒(méi)有使用Hibernate的關(guān)聯(lián)關(guān)系來(lái)進(jìn)行數(shù)據(jù)庫(kù)操作。所有的管理操作都是單獨(dú)實(shí)現(xiàn)的。所以也不能用Criteria.add()這種方式去查詢(xún)關(guān)聯(lián)的一方。所以只能用Native SQL去查詢(xún)結(jié)果返回對(duì)象了。按照Hibernate3的reference里面說(shuō)的

          16.1.?使用SQLQuery

          對(duì)原生SQL查詢(xún)執(zhí)行的控制是通過(guò)SQLQuery接口進(jìn)行的,通過(guò)執(zhí)行Session.createSQLQuery()獲取這個(gè)接口。最簡(jiǎn)單的情況下,我們可以采用以下形式:

          List cats = sess.createSQLQuery("select * from cats")
              .addEntity(Cat.class)
              .list();

          這個(gè)查詢(xún)指定了:

          • SQL查詢(xún)字符串

          • 查詢(xún)返回的實(shí)體

          這里,結(jié)果集字段名被假設(shè)為與映射文件中指明的字段名相同。對(duì)于連接了多個(gè)表的查詢(xún),這就可能造成問(wèn)題,因?yàn)榭赡茉诙鄠€(gè)表中出現(xiàn)同樣名字的字段。下面的方法就可以避免字段名重復(fù)的問(wèn)題:

          List cats = sess.createSQLQuery("select {cat.*} from cats cat")
              .addEntity("cat", Cat.class)
              .list();

          這個(gè)查詢(xún)指定了:

          • SQL查詢(xún)語(yǔ)句,它帶一個(gè)占位符,可以讓Hibernate使用字段的別名.

          • 查詢(xún)返回的實(shí)體,和它的SQL表的別名.

          addEntity()方法將SQL表的別名和實(shí)體類(lèi)聯(lián)系起來(lái),并且確定查詢(xún)結(jié)果集的形態(tài)。

          addJoin()方法可以被用于載入其他的實(shí)體和集合的關(guān)聯(lián).

          List cats = sess.createSQLQuery(
                  "select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id"
              )
              .addEntity("cat", Cat.class)
              .addJoin("kitten", "cat.kittens")
              .list();

          原生的SQL查詢(xún)可能返回一個(gè)簡(jiǎn)單的標(biāo)量值或者一個(gè)標(biāo)量和實(shí)體的結(jié)合體。

          Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat")
                  .addScalar("maxWeight", Hibernate.DOUBLE);
                  .uniqueResult();

          除此之外,你還可以在你的hbm文件中描述結(jié)果集映射信息,在查詢(xún)中使用。

          List cats = sess.createSQLQuery(
                  "select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id"
              )
              .setResultSetMapping("catAndKitten")
              .list();

          后來(lái)我使用了命名SQL查詢(xún)方式。

          16.3.?命名SQL查詢(xún)

          可以在映射文檔中定義查詢(xún)的名字,然后就可以象調(diào)用一個(gè)命名的HQL查詢(xún)一樣直接調(diào)用命名SQL查詢(xún).在這種情況下,我們 需要調(diào)用addEntity()方法.

          <sql-query name="persons">
              <return alias="person" class="eg.Person"/>
              SELECT person.NAME AS {person.name},
                     person.AGE AS {person.age},
                     person.SEX AS {person.sex}
              FROM PERSON person
              WHERE person.NAME LIKE :namePattern
          </sql-query>
          List people = sess.getNamedQuery("persons")
              .setString("namePattern", namePattern)
              .setMaxResults(50)
              .list();

          我覺(jué)得這種發(fā)式比較好。這樣寫(xiě)出來(lái)的sql可以很整齊。我們的數(shù)據(jù)庫(kù)使用的是oracle,不過(guò)按照這上面的寫(xiě)法發(fā)現(xiàn)sql語(yǔ)句有錯(cuò)誤。
          后來(lái)拿到控制臺(tái)執(zhí)行也抱錯(cuò)。因?yàn)樵瓉?lái)都用sqlserver,而sqlserver都是可以的。后來(lái)發(fā)現(xiàn)是表不能有別名改成這樣就好了。
          ????????????SELECT?T_PAY.sys_id?as?{pay.sysId},
          ???????????????????T_PAY.sys_flag?
          as?{pay.sysFlag},
          ???????????????????T_PAY.sys_domain?
          as?{pay.sysDomain},
          ???????????????????T_PAY.sys_owner?
          as?{pay.sysOwner},
          ???????????????????T_PAY.sys_create_date?
          as?{pay.sysCreateDate},
          ???????????????????T_PAY.sys_update_date?
          as?{pay.sysUpdateDate},
          ???????????????????T_PAY.pay_id?
          as?{pay.payId},
          ???????????????????T_PAY.pay_name?
          as?{pay.payName},
          ???????????????????T_PAY.pay_type_id?
          as?{pay.payTypeId},
          ???????????????????T_PAY.pay_date?
          as?{pay.payDate},
          ???????????????????T_PAY.money_type_id?
          as?{pay.moneyTypeId},
          ???????????????????T_PAY.amount?
          as?{pay.amount},
          ???????????????????T_PAY.payer_id?
          as?{pay.payerId},
          ???????????????????T_PAY.payer_name?
          as?{pay.payerName},
          ???????????????????T_PAY.accept_id?
          as?{pay.acceptId},
          ???????????????????T_PAY.accept_name?
          as?{pay.acceptName},
          ???????????????????T_PAY.pay_state_id?
          as?{pay.payStateId},
          ???????????????????T_PAY.remark?
          as?{pay.remark}
          ????????????
          FROM???T_PAY
          ????????????
          JOIN???T_BIZ_PAY
          ????????????
          ON???????T_PAY.pay_id?=?T_BIZ_PAY.pay_id
          ????????????
          WHERE??T_BIZ_PAY.biz_id?=?:bizId
          ? 這里要特別的提醒一下大家千萬(wàn)不要把主鍵忘了。剛開(kāi)始我就忘了主鍵,后來(lái)調(diào)試了半天才找出原因來(lái)。

          這樣在sping里面用回調(diào)查詢(xún)一下就ok了。真的很方便.
          ????public?List?getPaysByBizId(final?String?bizId)?{
          ????????
          return?(List)getHibernateTemplate().execute(new?HibernateCallback(){
          ????????????
          public?Object?doInHibernate(Session?session)throws?HibernateException{
          ????????????????Query?query?
          =?session.getNamedQuery("find.pays.by.bizid");
          ????????????????query.setParameter(
          "bizId",bizId);
          ????????????????
          return?query.list();
          ????????????}
          ????????},
          true);
          ????}
          posted on 2006-05-26 10:33 莫多 閱讀(3792) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Spring 、Hibernate

          <2006年5月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(1)

          隨筆分類(lèi)(27)

          隨筆檔案(22)

          Friends

          搜索

          •  

          積分與排名

          • 積分 - 62472
          • 排名 - 845

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 静海县| 陈巴尔虎旗| 永济市| 辛集市| 句容市| 建宁县| 巴彦淖尔市| 汤阴县| 乐业县| 阿瓦提县| 玉环县| 石首市| 南宁市| 来凤县| 乐陵市| 江安县| 财经| 叙永县| 江门市| 湘阴县| 永济市| 江城| 淮阳县| 应城市| 南宫市| 晋宁县| 额尔古纳市| 图木舒克市| 惠水县| 兴和县| 耒阳市| 西藏| 海门市| 正阳县| 伊宁市| 伊金霍洛旗| 陕西省| 久治县| 涞水县| 大港区| 乌兰察布市|