爪哇一角

          共同探討STRUTS#HIBERNATE#SPRING#EJB等技術
          posts - 3, comments - 6, trackbacks - 0, articles - 99
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
          現在的系統中雖然使用了。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);
          ????}
          主站蜘蛛池模板: 萨嘎县| 琼中| 罗源县| 萝北县| 仪征市| 阿鲁科尔沁旗| 贺兰县| 鲁山县| 古田县| 江孜县| 万全县| 梁山县| 威信县| 额济纳旗| 兴仁县| 兴义市| 米林县| 凯里市| 且末县| 曲松县| 陆河县| 北海市| 宁津县| 泰来县| 岫岩| 卓尼县| 泸水县| 屏南县| 岱山县| 潞西市| 如皋市| 横山县| 徐汇区| 随州市| 海兴县| 寿宁县| 嘉禾县| 昂仁县| 革吉县| 贡觉县| 米泉市|