Rory's Blog
          Happy study,Happy work,Happy life
          posts - 22,  comments - 46,  trackbacks - 0
          現在的系統中雖然使用了。Hibernate但是沒有使用Hibernate的關聯關系來進行數據庫操作。所有的管理操作都是單獨實現的。所以也不能用Criteria.add()這種方式去查詢關聯的一方。所以只能用Native SQL去查詢結果返回對象了。按照Hibernate3的reference里面說的

          16.1.?使用SQLQuery

          對原生SQL查詢執行的控制是通過SQLQuery接口進行的,通過執行Session.createSQLQuery()獲取這個接口。最簡單的情況下,我們可以采用以下形式:

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

          這個查詢指定了:

          • SQL查詢字符串

          • 查詢返回的實體

          這里,結果集字段名被假設為與映射文件中指明的字段名相同。對于連接了多個表的查詢,這就可能造成問題,因為可能在多個表中出現同樣名字的字段。下面的方法就可以避免字段名重復的問題:

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

          這個查詢指定了:

          • SQL查詢語句,它帶一個占位符,可以讓Hibernate使用字段的別名.

          • 查詢返回的實體,和它的SQL表的別名.

          addEntity()方法將SQL表的別名和實體類聯系起來,并且確定查詢結果集的形態。

          addJoin()方法可以被用于載入其他的實體和集合的關聯.

          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查詢可能返回一個簡單的標量值或者一個標量和實體的結合體。

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

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

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

          后來我使用了命名SQL查詢方式。

          16.3.?命名SQL查詢

          可以在映射文檔中定義查詢的名字,然后就可以象調用一個命名的HQL查詢一樣直接調用命名SQL查詢.在這種情況下,我們 需要調用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();

          我覺得這種發式比較好。這樣寫出來的sql可以很整齊。我們的數據庫使用的是oracle,不過按照這上面的寫法發現sql語句有錯誤。
          后來拿到控制臺執行也抱錯。因為原來都用sqlserver,而sqlserver都是可以的。后來發現是表不能有別名改成這樣就好了。
          ????????????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
          ? 這里要特別的提醒一下大家千萬不要把主鍵忘了。剛開始我就忘了主鍵,后來調試了半天才找出原因來。

          這樣在sping里面用回調查詢一下就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 莫多 閱讀(3787) 評論(0)  編輯  收藏 所屬分類: Spring 、Hibernate

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

          常用鏈接

          留言簿(1)

          隨筆分類(27)

          隨筆檔案(22)

          Friends

          搜索

          •  

          積分與排名

          • 積分 - 62267
          • 排名 - 845

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 贵港市| SHOW| 汪清县| 英吉沙县| 武乡县| 惠水县| 宣威市| 洪湖市| 名山县| 虹口区| 德惠市| 沽源县| 楚雄市| 武城县| 穆棱市| 尼勒克县| 运城市| 财经| 泸溪县| 嫩江县| 嘉鱼县| 迭部县| 道真| 武宣县| 格尔木市| 郯城县| 九寨沟县| 甘泉县| 屯留县| 东城区| 白沙| 石家庄市| 丰台区| 多伦县| 高雄市| 彭阳县| 博白县| 葫芦岛市| 扶余县| 宜君县| 皮山县|