<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    16.1.?使用SQLQuery

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

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

    這個查詢指定了:

    • SQL查詢字符串

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

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

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

    這個查詢指定了:

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

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

    addEntity()方法將SQL表的別名和實(shí)體類聯(liá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查詢可能返回一個簡單的標(biāo)量值或者一個標(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é)果集映射信息,在查詢中使用。

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

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

    16.3.?命名SQL查詢

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

    我覺得這種發(fā)式比較好。這樣寫出來的sql可以很整齊。我們的數(shù)據(jù)庫使用的是oracle,不過按照這上面的寫法發(fā)現(xiàn)sql語句有錯誤。
    后來拿到控制臺執(zhí)行也抱錯。因?yàn)樵瓉矶加胹qlserver,而sqlserver都是可以的。后來發(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
    ? 這里要特別的提醒一下大家千萬不要把主鍵忘了。剛開始我就忘了主鍵,后來調(diào)試了半天才找出原因來。

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

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

    常用鏈接

    留言簿(1)

    隨筆分類(27)

    隨筆檔案(22)

    Friends

    搜索

    •  

    積分與排名

    • 積分 - 62222
    • 排名 - 845

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产黄在线播放免费观看| 国产成人亚洲合集青青草原精品| 亚洲小说图区综合在线| 97碰公开在线观看免费视频| 亚洲福利视频一区二区三区| 免费A级毛片av无码| 亚洲黄色免费网站| 国产妇乱子伦视频免费| 亚洲国产精品成人精品小说| 无码国产精品一区二区免费式影视 | 国产一二三四区乱码免费| 亚洲综合在线另类色区奇米| 中文字幕免费在线看线人动作大片| 亚洲色自偷自拍另类小说| 国产精品区免费视频| 亚洲国产日韩在线一区| 24小时免费直播在线观看| 亚洲AV无码专区在线厂| 国产精品亚洲高清一区二区| 日韩精品无码免费专区午夜 | 羞羞漫画页面免费入口欢迎你| 免费午夜爽爽爽WWW视频十八禁| h片在线观看免费| 亚洲国产精品lv| 女人被男人躁的女爽免费视频| 在线观看亚洲免费| 国产精品亚洲片在线| 69堂人成无码免费视频果冻传媒| 亚洲午夜理论片在线观看| 免费**毛片在线播放直播| 中文字幕不卡高清免费| 亚洲国产超清无码专区| 国产成人高清精品免费软件| 三级黄色片免费看| 久久狠狠爱亚洲综合影院| 国产真人无遮挡作爱免费视频| a在线免费观看视频| 中文字幕在线观看亚洲日韩| 久久久久亚洲AV综合波多野结衣| 69av免费观看| 一区二区三区免费视频观看|