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

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

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

    與Java相伴的日子
    相識,相知,相戀,到相守......我的日子因你的到來而充實,我的日子因你的存在而多姿!
    posts - 4,comments - 31,trackbacks - 0

    ?

    ??????? 我的一個項目使用了Hibernate3操作Oracle9i數據庫,遇到一個很奇怪的問題,即在按某些使用了聚合函數的值的升序排序后,翻頁到一定頁數(通常是3或5)以后,顯示的內容不會變化,即出現不是期望的查詢結果.
    ??????? 剛開始仔細排查,找不出原因.后來通過查Hibernate 包中的Oracle9Dialect及OracleDialect的源碼,將Dialect換成 OracleDialect后問題解決.
    ?????? 但是,問題雖解決了,根源何在呢?為什么Oracle9卻要用到OracleDialect(源碼注解中說這是兼容Oracle8i)的才能解決問題呢?!
    ???? ?查看源碼,發現兩者取得分頁查詢字符串的方式是有點區別的(在 getlimitString()方法中).

    ?? ?在Oracle9Dialect中:

    ?? public ?String?getLimitString(String?sql,? boolean ?hasOffset)? {
    ??
    ??sql?
    = ?sql.trim();
    ??
    boolean ?isForUpdate? = ? false ;
    ??
    if ?(?sql.toLowerCase().endsWith( " ?for?update " )?)? {
    ???sql?
    = ?sql.substring(? 0 ,?sql.length() - 11 ?);
    ???isForUpdate?
    = ? true ;
    ??}

    ??
    ??StringBuffer?pagingSelect?
    = ? new ?StringBuffer(?sql.length() + 100 ?);
    ??
    if ?(hasOffset)? {
    ???pagingSelect.append(
    " select?*?from?(?select?row_.*,?rownum?rownum_?from?(? " );
    ??}

    ??
    else ? {
    ???pagingSelect.append(
    " select?*?from?(? " );
    ??}

    ??pagingSelect.append(sql);
    ??
    if ?(hasOffset)? {
    ???pagingSelect.append(
    " ?)?row_?where?rownum?<=??)?where?rownum_?>?? " );
    ??}

    ??
    else ? {
    ???pagingSelect.append(
    " ?)?where?rownum?<=?? " );
    ??}


    ??
    if ?(isForUpdate)?pagingSelect.append( " ?for?update " );
    ??
    ??
    return ?pagingSelect.toString();
    ?}



    ??????? 在OracleDialect中:

    public ?String?getLimitString(String?sql,? boolean ?hasOffset)? {

    ??sql?
    = ?sql.trim();
    ??
    boolean ?isForUpdate? = ? false ;
    ??
    if ?(?sql.toLowerCase().endsWith( " ?for?update " )?)? {
    ???sql?
    = ?sql.substring(? 0 ,?sql.length() - 11 ?);
    ???isForUpdate?
    = ? true ;
    ??}

    ??
    ??StringBuffer?pagingSelect?
    = ? new ?StringBuffer(?sql.length() + 100 ?);
    ??
    if ?(hasOffset)? {
    ???pagingSelect.append(
    " select?*?from?(?select?row_.*,?rownum?rownum_?from?(? " );
    ??}

    ??
    else ? {
    ???pagingSelect.append(
    " select?*?from?(? " );
    ??}

    ??pagingSelect.append(sql);
    ??
    if ?(hasOffset)? {
    ???pagingSelect.append(
    " ?)?row_?)?where?rownum_?<=???and?rownum_?>?? " );
    ??}

    ??
    else ? {
    ???pagingSelect.append(
    " ?)?where?rownum?<=?? " );
    ??}


    ??
    if ?(isForUpdate)?pagingSelect.append( " ?for?update " );
    ??
    ??
    return ?pagingSelect.toString();
    ?}



    ??????? 兩者的區別主要在于,前者:
    row_ where rownum <= ?) where rownum_ > ?
    后者:
    where rownum_ <= ? and rownum_ > ?

    我模擬了我的出問題的查詢,使用前者問題重現,使用后者不出問題.
    另外是,只在升序排序時才出問題,降序則不會.

    我的語句分別如下:
    *************************************************************************
    第一種:

    select ? * ? from ?(

    ?
    select ?rownum?row_num?,t. * ?? from (
    ?
    select ? Sum (b.disp_Count)?,? Sum (b.click_Count)?,?
    ???
    Sum (b.total_Price)?,? Sum (b.return_Cost)?,?
    ???
    avg (b.rank)??,?b.sta_Date???,?b.keyword_Name??,?
    ???b.union_Name??
    ???
    from ?Bid_Report?b??
    ????????
    where ??(b.sta_Date? = ' 20051129 ' )??
    ??????????
    group ? by ??b.sta_Date,??b.keyword_Name,??b.union_Name?
    ??????????
    order ? by ?? Sum (b.click_Count),?b.sta_Date?
    ????????)?t??
    where ?rownum <= 60
    ??)?
    where ?row_num? > ? 40


    (在Hibernate3中,Oracle9Dialect的getLimitString()方法采取類似實現方式)

    第二種:

    select ? * ? from ?(

    ?
    select ?rownum?row_num?,t. * ?? from (
    ?
    select ? Sum (b.disp_Count)?,? Sum (b.click_Count)?,?
    ???
    Sum (b.total_Price)?,? Sum (b.return_Cost)?,?
    ???
    avg (b.rank)??,?b.sta_Date???,?b.keyword_Name??,?
    ???b.union_Name??
    ???
    from ?Bid_Report?b??
    ????????
    where ??(b.sta_Date? = ' 20051129 ' )??
    ??????????
    group ? by ??b.sta_Date,??b.keyword_Name,??b.union_Name?
    ??????????
    order ? by ?? Sum (b.click_Count),?b.sta_Date??
    ????????)?t??
    ??)?
    where ?row_num? <= 60 ? and ?row_num > 40

    (在Hibernate3中,OracleDialect的getLimitString()方法采取類似實現方式)

    **********************************************************************

    現在,問題是:為什么采取后者就可以解決問題了呢?這是不是Oracle9Dialect的一個bug呢?!
    哪位高手能給我詳析,感激不盡!!!!

    posted on 2005-12-30 09:41 南一郎 閱讀(1350) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 色吊丝免费观看网站| 亚洲日本久久一区二区va| 国产亚洲精品国产福利在线观看 | 亚洲欧洲日韩国产综合在线二区| 国产乱子伦精品免费视频| 亚洲中文字幕无码专区| 4虎永免费最新永久免费地址| 亚洲一区免费观看| 91香蕉在线观看免费高清| 亚洲精品在线网站| 人成电影网在线观看免费| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 亚洲日本乱码一区二区在线二产线 | 精品国产免费一区二区三区| a级亚洲片精品久久久久久久| 成人久久免费网站| 亚洲一区二区三区首页| 97在线观看永久免费视频| 亚洲日韩看片无码电影| www.亚洲精品| 暖暖在线视频免费视频| 亚洲午夜久久久久久尤物| 在线观看免费a∨网站| 四虎影视永久在线精品免费| 水蜜桃亚洲一二三四在线| 成人免费的性色视频| 亚洲av无码专区国产不乱码 | 久久久亚洲精华液精华液精华液 | 天堂亚洲免费视频| 香蕉蕉亚亚洲aav综合| 无码日韩人妻av一区免费| 深夜A级毛片视频免费| 久久99国产亚洲高清观看首页| 亚洲人成免费网站| 精品国产日韩亚洲一区在线| 亚洲Av永久无码精品三区在线 | 花蝴蝶免费视频在线观看高清版 | 又爽又黄无遮挡高清免费视频| 最近免费中文字幕中文高清| 亚洲jjzzjjzz在线播放| 亚洲七七久久精品中文国产|