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

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

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

    kelefa  
    大千世界中,唯一缺乏的就是人類的注意力。
    日歷
    <2010年9月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789
    統計
    • 隨筆 - 11
    • 文章 - 0
    • 評論 - 28
    • 引用 - 0

    導航

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

     
    不知道是自己對hibernate不了解,用的不對, 還是db2版本問題, 以前的一個項目用到db2, hibernate, 以為hibernate已經幫我們做好分頁的一切事情,只要用就行了, 代碼大概如下:

    ????
    /**
    ?????*?設置分頁,?pageNo或pageList<=0時返回所有記錄
    ?????*?
    ?????*?
    @param?pageNo
    ?????*??????????頁數,?從1開始,?<=0時返回所有記錄
    ?????*?
    @param?pageList
    ?????*??????????每頁記錄數,?<=0時返回所有記錄
    ?????*?
    @param?query
    ?????
    */

    ????
    public?static?void?pagination(?int?pageNo,?int?pageList,?Query?query?)
    ????
    {
    ????????
    if?(?pageList?>?0?&&?pageNo?>?0?)
    ????????
    {
    ????????????query.setMaxResults(?pageList?);
    ????????????
    int?beginIndex?=?(pageNo?-?1)?*?pageList;
    ????????????query.setFirstResult(?beginIndex?);
    ????????}

    ????}


    ????
    /**
    ?????*?設置分頁,?pageNo或pageList<=0時返回所有記錄
    ?????*?
    ?????*?
    @param?pageNo
    ?????*??????????頁數,?從1開始,?<=0時返回所有記錄
    ?????*?
    @param?pageList
    ?????*??????????每頁記錄數,?<=0時返回所有記錄
    ?????*?
    @param?criteria
    ?????
    */

    ????
    public?static?void?pagination(?int?pageNo,?int?pageList,?Criteria?criteria?)
    ????
    {
    ????????
    if?(?pageList?>?0?&&?pageNo?>?0?)
    ????????
    {
    ????????????criteria.setMaxResults(?pageList?);
    ????????????
    int?beginIndex?=?(pageNo?-?1)?*?pageList;
    ????????????criteria.setFirstResult(?beginIndex?);
    ????????}

    ????}
    ?

    一開始, 在hibernate.properties的配置:
    ????hibernate.dialect?org.hibernate.dialect.DB2Dialect
    ????hibernate.connection.driver_class?COM.ibm.db2.jdbc.net.DB2Driver

    一運行就拋出異常, 改成:
    ????hibernate.dialect?org.hibernate.dialect.DB2400Dialect
    ????hibernate.connection.driver_class?COM.ibm.db2.jdbc.net.DB2Driver

    居然ok了, 大家都很高興, 以為什么都解決了, 也運行了一段時間,感覺有時候性能很差.
    ?后來, 在有分頁的地方一頁一頁的點下去, 點到40頁左右(每頁15條記錄), 頁面就卡住了, 檢查生成的sql語句, 發現是這樣的sql:
    ?
    select?*?from?T?fetch?first?600?rows?only

    ?我想fetch first 600 rows only大概就是頁面卡住的原因了
    ?
    ?再看org.hibernate.dialect.DB2Dialect的源碼, 發現數據庫拋出異常是因為:
    ?1. DB2Dialect生成的sql有兩個order by, 應該只保留over()里面的order by
    ?2. 當sql含有select distinct的時候, 要替換表別名為row_, 替換字段名為hibernate生成的字段名別名
    ?
    ?把org.hibernate.dialect.DB2Dialect進行修改后, 目前運行還沒有發現什么問題.
    ?
    ?db2的版本好像7.x, 是不是版本太低, 或jdbc的版本問題呢, 也許hibernate的org.hibernate.dialect.DB2Dialect是沒有問題的, 呵呵.
    ?各位老大有沒有這方面的經驗, 有更好的解決方法請回復, 非常感謝!
    ?
    ?修改的DB2Dialect代碼如下:

    import?java.sql.CallableStatement;
    import?java.sql.ResultSet;
    import?java.sql.SQLException;
    import?java.sql.Types;

    import?org.apache.log4j.Logger;
    import?org.hibernate.Hibernate;
    import?org.hibernate.cfg.Environment;
    import?org.hibernate.dialect.Dialect;
    import?org.hibernate.dialect.function.NoArgSQLFunction;
    import?org.hibernate.dialect.function.SQLFunctionTemplate;
    import?org.hibernate.dialect.function.StandardSQLFunction;
    import?org.hibernate.dialect.function.VarArgsSQLFunction;
    import?org.hibernate.dialect.function.AnsiTrimEmulationFunction;

    /**
    ?*?An?SQL?dialect?for?DB2.
    ?*?
    ?*?
    @author?Gavin?King
    ?
    */

    public?class?DB2Dialect
    ????????
    extends?Dialect
    {
    ????
    private?static?final?Logger?log?=?Logger.getLogger(?DB2Dialect.class?);

    ????
    public?DB2Dialect()
    ????
    {
    ????????
    super();
    ????????registerColumnType(?Types.BIT,?
    "smallint"?);
    ????????registerColumnType(?Types.BIGINT,?
    "bigint"?);
    ????????registerColumnType(?Types.SMALLINT,?
    "smallint"?);
    ????????registerColumnType(?Types.TINYINT,?
    "smallint"?);
    ????????registerColumnType(?Types.INTEGER,?
    "integer"?);
    ????????registerColumnType(?Types.CHAR,?
    "char(1)"?);
    ????????registerColumnType(?Types.VARCHAR,?
    "varchar($l)"?);
    ????????registerColumnType(?Types.FLOAT,?
    "float"?);
    ????????registerColumnType(?Types.DOUBLE,?
    "double"?);
    ????????registerColumnType(?Types.DATE,?
    "date"?);
    ????????registerColumnType(?Types.TIME,?
    "time"?);
    ????????registerColumnType(?Types.TIMESTAMP,?
    "timestamp"?);
    ????????registerColumnType(?Types.VARBINARY,?
    "varchar($l)?for?bit?data"?);
    ????????registerColumnType(?Types.NUMERIC,?
    "numeric($p,$s)"?);
    ????????registerColumnType(?Types.BLOB,?
    "blob($l)"?);
    ????????registerColumnType(?Types.CLOB,?
    "clob($l)"?);

    ????????registerFunction(?
    "abs",?new?StandardSQLFunction(?"abs"?)?);
    ????????registerFunction(?
    "absval",?new?StandardSQLFunction(?"absval"?)?);
    ????????registerFunction(?
    "sign",?new?StandardSQLFunction(?"sign",?Hibernate.INTEGER?)?);

    ????????registerFunction(?
    "ceiling",?new?StandardSQLFunction(?"ceiling"?)?);
    ????????registerFunction(?
    "ceil",?new?StandardSQLFunction(?"ceil"?)?);
    ????????registerFunction(?
    "floor",?new?StandardSQLFunction(?"floor"?)?);
    ????????registerFunction(?
    "round",?new?StandardSQLFunction(?"round"?)?);

    ????????registerFunction(?
    "acos",?new?StandardSQLFunction(?"acos",?Hibernate.DOUBLE?)?);
    ????????registerFunction(?
    "asin",?new?StandardSQLFunction(?"asin",?Hibernate.DOUBLE?)?);
    ????????registerFunction(?
    "atan",?new?StandardSQLFunction(?"atan",?Hibernate.DOUBLE?)?);
    ????????registerFunction(?
    "cos",?new?StandardSQLFunction(?"cos",?Hibernate.DOUBLE?)?);
    ????????registerFunction(?
    "cot",?new?StandardSQLFunction(?"cot",?Hibernate.DOUBLE?)?);
    ????????registerFunction(?
    "degrees",?new?StandardSQLFunction(?"degrees",?Hibernate.DOUBLE?)?);
    ????????registerFunction(?
    "exp",?new?StandardSQLFunction(?"exp",?Hibernate.DOUBLE?)?);
    ????????registerFunction(?
    "float",?new?StandardSQLFunction(?"float",?Hibernate.DOUBLE?)?);
    ????????registerFunction(?
    "hex",?new?StandardSQLFunction(?"hex",?Hibernate.STRING?)?);
    ????????registerFunction(?
    "ln",?new?StandardSQLFunction(?"ln",?Hibernate.DOUBLE?)?);
    ????????registerFunction(?
    "log",?new?StandardSQLFunction(?"log",?Hibernate.DOUBLE?)?);
    ????????registerFunction(?
    "log10",?new?StandardSQLFunction(?"log10",?Hibernate.DOUBLE?)?);
    ????????registerFunction(?
    "radians",?new?StandardSQLFunction(?"radians",?Hibernate.DOUBLE?)?);
    ????????registerFunction(?
    "rand",?new?NoArgSQLFunction(?"rand",?Hibernate.DOUBLE?)?);
    ????????registerFunction(?
    "sin",?new?StandardSQLFunction(?"sin",?Hibernate.DOUBLE?)?);
    ????????registerFunction(?
    "soundex",?new?StandardSQLFunction(?"soundex",?Hibernate.STRING?)?);
    ????????registerFunction(?
    "sqrt",?new?StandardSQLFunction(?"sqrt",?Hibernate.DOUBLE?)?);
    ????????registerFunction(?
    "stddev",?new?StandardSQLFunction(?"stddev",?Hibernate.DOUBLE?)?);
    ????????registerFunction(?
    "tan",?new?StandardSQLFunction(?"tan",?Hibernate.DOUBLE?)?);
    ????????registerFunction(?
    "variance",?new?StandardSQLFunction(?"variance",?Hibernate.DOUBLE?)?);

    ????????registerFunction(?
    "julian_day",?new?StandardSQLFunction(?"julian_day",?Hibernate.INTEGER?)?);
    ????????registerFunction(?
    "microsecond",?new?StandardSQLFunction(?"microsecond",?Hibernate.INTEGER?)?);
    ????????registerFunction(?
    "midnight_seconds",?new?StandardSQLFunction(?"midnight_seconds",?Hibernate.INTEGER?)?);
    ????????registerFunction(?
    "minute",?new?StandardSQLFunction(?"minute",?Hibernate.INTEGER?)?);
    ????????registerFunction(?
    "month",?new?StandardSQLFunction(?"month",?Hibernate.INTEGER?)?);
    ????????registerFunction(?
    "monthname",?new?StandardSQLFunction(?"monthname",?Hibernate.STRING?)?);
    ????????registerFunction(?
    "quarter",?new?StandardSQLFunction(?"quarter",?Hibernate.INTEGER?)?);
    ????????registerFunction(?
    "hour",?new?StandardSQLFunction(?"hour",?Hibernate.INTEGER?)?);
    ????????registerFunction(?
    "second",?new?StandardSQLFunction(?"second",?Hibernate.INTEGER?)?);
    ????????registerFunction(?
    "current_date",?new?NoArgSQLFunction(?"current?date",?Hibernate.DATE,?false?)?);
    ????????registerFunction(?
    "date",?new?StandardSQLFunction(?"date",?Hibernate.DATE?)?);
    ????????registerFunction(?
    "day",?new?StandardSQLFunction(?"day",?Hibernate.INTEGER?)?);
    ????????registerFunction(?
    "dayname",?new?StandardSQLFunction(?"dayname",?Hibernate.STRING?)?);
    ????????registerFunction(?
    "dayofweek",?new?StandardSQLFunction(?"dayofweek",?Hibernate.INTEGER?)?);
    ????????registerFunction(?
    "dayofweek_iso",?new?StandardSQLFunction(?"dayofweek_iso",?Hibernate.INTEGER?)?);
    ????????registerFunction(?
    "dayofyear",?new?StandardSQLFunction(?"dayofyear",?Hibernate.INTEGER?)?);
    ????????registerFunction(?
    "days",?new?StandardSQLFunction(?"days",?Hibernate.LONG?)?);
    ????????registerFunction(?
    "current_time",?new?NoArgSQLFunction(?"current?time",?Hibernate.TIME,?false?)?);
    ????????registerFunction(?
    "time",?new?StandardSQLFunction(?"time",?Hibernate.TIME?)?);
    ????????registerFunction(?
    "current_timestamp",?new?NoArgSQLFunction(?"current?timestamp",?Hibernate.TIMESTAMP,?false?)?);
    ????????registerFunction(?
    "timestamp",?new?StandardSQLFunction(?"timestamp",?Hibernate.TIMESTAMP?)?);
    ????????registerFunction(?
    "timestamp_iso",?new?StandardSQLFunction(?"timestamp_iso",?Hibernate.TIMESTAMP?)?);
    ????????registerFunction(?
    "week",?new?StandardSQLFunction(?"week",?Hibernate.INTEGER?)?);
    ????????registerFunction(?
    "week_iso",?new?StandardSQLFunction(?"week_iso",?Hibernate.INTEGER?)?);
    ????????registerFunction(?
    "year",?new?StandardSQLFunction(?"year",?Hibernate.INTEGER?)?);

    ????????registerFunction(?
    "double",?new?StandardSQLFunction(?"double",?Hibernate.DOUBLE?)?);
    ????????registerFunction(?
    "varchar",?new?StandardSQLFunction(?"varchar",?Hibernate.STRING?)?);
    ????????registerFunction(?
    "real",?new?StandardSQLFunction(?"real",?Hibernate.FLOAT?)?);
    ????????registerFunction(?
    "bigint",?new?StandardSQLFunction(?"bigint",?Hibernate.LONG?)?);
    ????????registerFunction(?
    "char",?new?StandardSQLFunction(?"char",?Hibernate.CHARACTER?)?);
    ????????registerFunction(?
    "integer",?new?StandardSQLFunction(?"integer",?Hibernate.INTEGER?)?);
    ????????registerFunction(?
    "smallint",?new?StandardSQLFunction(?"smallint",?Hibernate.SHORT?)?);

    ????????registerFunction(?
    "digits",?new?StandardSQLFunction(?"digits",?Hibernate.STRING?)?);
    ????????registerFunction(?
    "chr",?new?StandardSQLFunction(?"chr",?Hibernate.CHARACTER?)?);
    ????????registerFunction(?
    "upper",?new?StandardSQLFunction(?"upper"?)?);
    ????????registerFunction(?
    "lower",?new?StandardSQLFunction(?"lower"?)?);
    ????????registerFunction(?
    "ucase",?new?StandardSQLFunction(?"ucase"?)?);
    ????????registerFunction(?
    "lcase",?new?StandardSQLFunction(?"lcase"?)?);
    ????????registerFunction(?
    "length",?new?StandardSQLFunction(?"length",?Hibernate.LONG?)?);
    ????????registerFunction(?
    "ltrim",?new?StandardSQLFunction(?"ltrim"?)?);
    ????????registerFunction(?
    "rtrim",?new?StandardSQLFunction(?"rtrim"?)?);
    ????????registerFunction(?
    "substr",?new?StandardSQLFunction(?"substr",?Hibernate.STRING?)?);
    ????????registerFunction(?
    "posstr",?new?StandardSQLFunction(?"posstr",?Hibernate.INTEGER?)?);

    ????????registerFunction(?
    "substring",?new?StandardSQLFunction(?"substr",?Hibernate.STRING?)?);
    ????????registerFunction(?
    "bit_length",?new?SQLFunctionTemplate(?Hibernate.INTEGER,?"length(?1)*8"?)?);
    ????????registerFunction(?
    "trim",?new?AnsiTrimEmulationFunction()?);
    ????????registerFunction(?
    "concat",?new?VarArgsSQLFunction(?Hibernate.STRING,?"",?"||",?""?)?);
    ????????registerFunction(?
    "str",?new?SQLFunctionTemplate(?Hibernate.STRING,????"rtrim(char(?1))"?)?);

    ????????registerKeyword(?
    "current"?);
    ????????registerKeyword(?
    "date"?);
    ????????registerKeyword(?
    "time"?);
    ????????registerKeyword(?
    "timestamp"?);
    ????????registerKeyword(?
    "fetch"?);
    ????????registerKeyword(?
    "first"?);
    ????????registerKeyword(?
    "rows"?);
    ????????registerKeyword(?
    "only"?);

    ????????getDefaultProperties().setProperty(?Environment.STATEMENT_BATCH_SIZE,?NO_BATCH?);
    ????}


    ????
    public?String?getLowercaseFunction()
    ????
    {
    ????????
    return?"lcase";
    ????}


    ????
    public?String?getAddColumnString()
    ????
    {
    ????????
    return?"add?column";
    ????}


    ????
    public?boolean?dropConstraints()
    ????
    {
    ????????
    return?false;
    ????}


    ????
    public?boolean?supportsIdentityColumns()
    ????
    {
    ????????
    return?true;
    ????}


    ????
    public?String?getIdentitySelectString()
    ????
    {
    ????????
    return?"values?identity_val_local()";
    ????}


    ????
    public?String?getIdentityColumnString()
    ????
    {
    ????????
    return?"generated?by?default?as?identity";?//?not?null??(start?with?1)
    ????????
    //?is?implicit
    ????}


    ????
    public?String?getIdentityInsertString()
    ????
    {
    ????????
    return?"default";
    ????}


    ????
    public?String?getSequenceNextValString(?String?sequenceName?)
    ????
    {
    ????????
    return?"values?nextval?for?"?+?sequenceName;
    ????}


    ????
    public?String?getCreateSequenceString(?String?sequenceName?)
    ????
    {
    ????????
    return?"create?sequence?"?+?sequenceName;
    ????}


    ????
    public?String?getDropSequenceString(?String?sequenceName?)
    ????
    {
    ????????
    return?"drop?sequence?"?+?sequenceName?+?"?restrict";
    ????}


    ????
    public?boolean?supportsSequences()
    ????
    {
    ????????
    return?true;
    ????}


    ????
    public?String?getQuerySequencesString()
    ????
    {
    ????????
    return?"select?seqname?from?sysibm.syssequences";
    ????}


    ????
    public?boolean?supportsLimit()
    ????
    {
    ????????
    return?true;
    ????}


    ????
    /*
    ?????*?public?String?getLimitString(String?sql,?boolean?hasOffset)?{?StringBuffer
    ?????*?rownumber?=?new?StringBuffer(50)?.append("?rownumber()?over(");?int
    ?????*?orderByIndex?=?sql.toLowerCase().indexOf("order?by");?if?(orderByIndex>0)
    ?????*?rownumber.append(?sql.substring(orderByIndex)?);?rownumber.append(")?as
    ?????*?row_,");?StringBuffer?pagingSelect?=?new?StringBuffer(?sql.length()+100?)
    ?????*?.append("select?*?from?(?")?.append(sql)?.insert(
    ?????*?getAfterSelectInsertPoint(sql)+16,?rownumber.toString()?)?.append("?)?as
    ?????*?temp_?where?row_?");?if?(hasOffset)?{?pagingSelect.append("between??+1?and
    ?????*??");?}?else?{?pagingSelect.append("<=??");?}?return
    ?????*?pagingSelect.toString();?}
    ?????
    */


    ????
    /**
    ?????*?Render?the?<tt>rownumber()?over?(?.?)?as?rownumber_,</tt>?bit,?that
    ?????*?goes?in?the?select?list
    ?????
    */

    ????
    private?String?getRowNumber(?String?sql?)
    ????
    {
    ????????StringBuffer?rownumber?
    =?new?StringBuffer(?50?)
    ????????????????.append(?
    "rownumber()?over("?);

    ????????
    int?orderByIndex?=?sql.toLowerCase().indexOf(?"order?by"?);

    ????????
    if?(?orderByIndex?>?0?)
    ????????
    {
    ????????????String?orderBy?
    =?sql.substring(?orderByIndex?);?//order?by?bid0_.bid_id?desc,?item.item_id?asc
    ????????????if?(?hasDistinct(?sql?)?)
    ????????????
    {
    ????????????????
    for?(?int?fromIndex?=?0;?;??)
    ????????????????
    {//?替換?表別名?為?row_
    ????????????????????int?dotIx?=?orderBy.indexOf(?".",?fromIndex?);
    ????????????????????
    if?(?dotIx?==?-1?)?break;
    ????????????????????
    int?spaceIx?=?orderBy.substring(?fromIndex,?dotIx?).lastIndexOf(?"?"?);
    ????????????????????String?tableAlias?
    =?orderBy.substring(?spaceIx?+?1,?dotIx?);
    ????????????????????orderBy?
    =?orderBy.replaceAll(?tableAlias,?"row_"?);????
    ????????????????????fromIndex?
    =?dotIx+1;
    ????????????????}

    ????????????????
    for?(?int?fromIndex?=?0;?;??)
    ????????????????
    {//?替換?字段名?為?hibernate生成的?字段名別名
    ????????????????????int?dotIx?=?orderBy.indexOf(?".",?fromIndex?);
    ????????????????????
    if?(?dotIx?==?-1?)?break;
    ????????????????????
    int?first1?=?orderBy.indexOf(?"?",?dotIx?);//第一個空格
    ????????????????????int?first2?=?orderBy.indexOf(?",",?dotIx?);//第一個逗號
    ????????????????????int?endIndex?=?getEndIndex(?first1,?first2?);
    ????????????????????String?col?
    =?null;
    ????????????????????
    if?(?endIndex?==?-1?)
    ????????????????????????col?
    =?orderBy.substring(?dotIx+1?);
    ????????????????????
    else??
    ????????????????????????col?
    =?orderBy.substring(?dotIx+1,?endIndex?);
    ????????????????????????
    ????????????????????
    //bid0_.bid_id?as?bid1_4_,
    ????????????????????String?beforeStr?=?"."?+?col?+?"?as?";
    ????????????????????
    int?pos?=?sql.indexOf(?beforeStr?);
    ????????????????????
    if?(?pos?>?-1?)
    ????????????????????
    {
    ????????????????????????pos?
    +=?beforeStr.length();
    ????????????????????????first1?
    =?sql.indexOf(?"?",?pos?);//第一個空格
    ????????????????????????first2?=?sql.indexOf(?",",?pos?);//第一個逗號
    ????????????????????????endIndex?=?getEndIndex(?first1,?first2?);
    ????????????????????????String?colAlias?
    =?null;
    ????????????????????????
    if?(?endIndex?==?-1?)
    ????????????????????????????colAlias?
    =?sql.substring(?pos?);
    ????????????????????????
    else??
    ????????????????????????????colAlias?
    =?sql.substring(?pos,?endIndex?);
    ????????????????????????orderBy?
    =?orderBy.replaceAll(?col,?colAlias?);
    ????????????????????}

    ????????????????????fromIndex?
    =?dotIx+1;
    ????????????????}

    ????????????????rownumber.append(?orderBy?);
    ????????????}

    ????????????
    else
    ????????????????rownumber.append(?orderBy?);
    ????????}


    ????????rownumber.append(?
    ")?as?rownumber_,"?);

    ????????
    return?rownumber.toString();
    ????}

    ????
    ????
    private?int?getEndIndex(?int?first1,?int?first2?)
    ????
    {
    ????????
    if?(?first1?==?-1?&&?first2?==?-1?)
    ????????????
    return?-1;
    ????????
    else?if?(?first1?>?-1?&&?first2?>?-1?)
    ????????????
    return?Math.min(?first1,?first2?);
    ????????
    else
    ????????????
    return?first1?+?first2?+?1;
    ????}


    ????
    public?String?getLimitString(?String?sql,?boolean?hasOffset?)
    ????
    {
    ????????
    if?(?log.isDebugEnabled()?)?
    ????????????log.debug(?
    "sql?=?"?+?sql?);

    ????????
    int?startOfSelect?=?sql.toLowerCase().indexOf(?"select"?);

    ????????StringBuffer?pagingSelect?
    =?new?StringBuffer(?sql.length()?+?100?).append(
    ????????????????sql.substring(?
    0,?startOfSelect?)?)?//?add?the?comment
    ????????????????.append(?"select?*?from?(?select?"?)?//?nest?the?main?query?in?an?outer
    ????????????????????????????????????????????????????????????????????????????????????????????
    //?select
    ????????????????.append(?getRowNumber(?sql?)?);?//?add?the?rownnumber?bit?into?the?outer
    ????????????????????????????????????????????????????????????????????????????????
    //?query?select?list

    ????????
    int?orderByIndex?=?sql.toLowerCase().indexOf(?"order?by"?);
    ????????
    if?(?hasDistinct(?sql?)?)
    ????????
    {
    ????????????pagingSelect.append(?
    "?row_.*?from?(?"?);?//?add?another?(inner)?nested
    ????????????????????????????????????????????????????????????????????????????????????????????????
    //?select

    ????????????
    //?add?the?main?query
    ????????????if?(?orderByIndex?>?0?)?//?whithout?ordey?by
    ????????????????pagingSelect.append(?sql.substring(?startOfSelect,?orderByIndex?)?);
    ????????????
    else
    ????????????????pagingSelect.append(?sql.substring(?startOfSelect?)?);

    ????????????pagingSelect.append(?
    "?)?as?row_"?);?//?close?off?the?inner?nested?select
    ????????}

    ????????
    else
    ????????
    {//?add?the?main?query
    ????????????if?(?orderByIndex?>?0?)?//?whithout?ordey?by
    ????????????????pagingSelect.append(?sql.substring(?startOfSelect?+?6,?orderByIndex?)?);
    ????????????
    else
    ????????????????pagingSelect.append(?sql.substring(?startOfSelect?
    +?6?)?);
    ????????}


    ????????pagingSelect.append(?
    "?)?as?temp_?where?rownumber_?"?);

    ????????
    //?add?the?restriction?to?the?outer?select
    ????????if?(?hasOffset?)
    ????????
    {
    ????????????pagingSelect.append(?
    "between??+1?and??"?);
    ????????}

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


    ????????
    if?(?log.isDebugEnabled()?)??
    ????????????log.debug(?
    "pagingSelectSQL?=?"?+?pagingSelect.toString()?);
    ????????
    ????????
    return?pagingSelect.toString();
    ????}


    ????
    private?static?boolean?hasDistinct(?String?sql?)
    ????
    {
    ????????
    return?sql.toLowerCase().indexOf(?"select?distinct"?)?>=?0;
    ????}


    ????
    public?String?getForUpdateString()
    ????
    {
    ????????
    return?"?for?read?only?with?rs";
    ????}


    ????
    public?boolean?useMaxForLimit()
    ????
    {
    ????????
    return?true;
    ????}


    ????
    public?boolean?supportsOuterJoinForUpdate()
    ????
    {
    ????????
    return?false;
    ????}


    ????
    public?boolean?supportsNotNullUnique()
    ????
    {
    ????????
    return?false;
    ????}


    ????
    public?String?getSelectClauseNullString(?int?sqlType?)
    ????
    {
    ????????String?literal;
    ????????
    switch?(?sqlType?)
    ????????
    {
    ????????????
    case?Types.VARCHAR:
    ????????????
    case?Types.CHAR:
    ????????????????literal?
    =?"'x'";
    ????????????????
    break;
    ????????????
    case?Types.DATE:
    ????????????????literal?
    =?"'2000-1-1'";
    ????????????????
    break;
    ????????????
    case?Types.TIMESTAMP:
    ????????????????literal?
    =?"'2000-1-1?00:00:00'";
    ????????????????
    break;
    ????????????
    case?Types.TIME:
    ????????????????literal?
    =?"'00:00:00'";
    ????????????????
    break;
    ????????????
    default:
    ????????????????literal?
    =?"0";
    ????????}

    ????????
    return?"nullif("?+?literal?+?','?+?literal?+?')';
    ????}


    ????
    public?static?void?main(?String[]?args?)
    ????
    {
    ????????System.out.println(?
    new?DB2Dialect().getLimitString(
    ????????????????
    "/*foo*/?select?*?from?foos",?true?)?);
    ????????System.out.println(?
    new?DB2Dialect().getLimitString(
    ????????????????
    "/*foo*/?select?distinct?*?from?foos",?true?)?);
    ????????System.out.println(?
    new?DB2Dialect().getLimitString(
    ????????????????
    "/*foo*/?select?*?from?foos?foo?order?by?foo.bar,?foo.baz",?true?)?);
    ????????System.out.println(?
    new?DB2Dialect().getLimitString(
    ????????????????
    "/*foo*/?select?distinct?*?from?foos?foo?order?by?foo.bar,?foo.baz",
    ????????????????
    true?)?);
    ????????String?sql?
    =?"select?distinct?bid0_.bid_id?as?bid1_4_,?bid0_.downloadFilePath?as?download2_4_,?bid0_.agency?as?agency4_,?bid0_.updateTime?as?updateTime4_,?bid0_.effectTime?as?effectTime4_,?bid0_.explainText?as?explainT6_4_,?bid0_.name?as?name4_,?bid0_.people?as?people4_,?bid0_.state?as?state4_,?bid0_.report?as?report4_,?bid0_.bid_project_id?as?bid11_4_,?bid0_.company_account_id?as?company12_4_,?bid0_.area_id?as?area13_4_?from?bid?bid0_?inner?join?bid_allow_member?allowmembe1_?on?bid0_.bid_id=allowmembe1_.bid_id?where?allowmembe1_.department_id=1381?and?bid0_.area_id=5?and?bid0_.state>0?order?by?bid0_.bid_id?desc";
    ????????System.out.println(?
    new?DB2Dialect().getLimitString(?sql,?true?)?);
    ????}


    ????
    public?boolean?supportsUnionAll()
    ????
    {
    ????????
    return?true;
    ????}


    ????
    public?int?registerResultSetOutParameter(?CallableStatement?statement,?int?col?)
    ????????????
    throws?SQLException
    ????
    {
    ????????
    return?col;
    ????}


    ????
    public?ResultSet?getResultSet(?CallableStatement?ps?)
    ????????????
    throws?SQLException
    ????
    {
    ????????
    boolean?isResultSet?=?ps.execute();
    ????????
    //?This?assumes?you?will?want?to?ignore?any?update?counts
    ????????while?(?!isResultSet?&&?ps.getUpdateCount()?!=?-1?)
    ????????
    {
    ????????????isResultSet?
    =?ps.getMoreResults();
    ????????}

    ????????ResultSet?rs?
    =?ps.getResultSet();
    ????????
    //?You?may?still?have?other?ResultSets?or?update?counts?left?to?process?here
    ????????
    //?but?you?can't?do?it?now?or?the?ResultSet?you?just?got?will?be?closed
    ????????return?rs;
    ????}


    ????
    public?boolean?supportsCommentOn()
    ????
    {
    ????????
    return?true;
    ????}


    ????
    public?boolean?supportsTemporaryTables()
    ????
    {
    ????????
    return?true;
    ????}


    ????
    public?String?getCreateTemporaryTableString()
    ????
    {
    ????????
    return?"declare?global?temporary?table";
    ????}


    ????
    public?String?getCreateTemporaryTablePostfix()
    ????
    {
    ????????
    return?"not?logged";
    ????}


    ????
    public?String?generateTemporaryTableName(?String?baseTableName?)
    ????
    {
    ????????
    return?"session."?+?super.generateTemporaryTableName(?baseTableName?);
    ????}


    ????
    public?boolean?supportsCurrentTimestampSelection()
    ????
    {
    ????????
    return?true;
    ????}


    ????
    public?String?getCurrentTimestampSelectString()
    ????
    {
    ????????
    return?"values?current?timestamp";
    ????}


    ????
    public?boolean?isCurrentTimestampSelectStringCallable()
    ????
    {
    ????????
    return?false;
    ????}


    ????
    public?boolean?supportsParametersInInsertSelect()
    ????
    {
    ????????
    //?DB2?known?to?not?support?parameters?within?the?select
    ????????
    //?clause?of?an?SQL?INSERT??SELECT??statement
    ????????return?false;
    ????}


    ????
    public?String?getCurrentTimestampSQLFunctionName()
    ????
    {
    ????????
    return?"sysdate";
    ????}

    }
    posted on 2006-12-27 11:17 楊杰榮 閱讀(3905) 評論(3)  編輯  收藏 所屬分類: webwork,hibernate
    評論:
    • # re: hibernate中DB2數據庫的dialect分頁問題  s Posted @ 2006-12-27 14:25
      fdsfsdf  回復  更多評論   

    • # re: hibernate中DB2數據庫的dialect分頁問題  Kevi Chen Posted @ 2007-08-27 11:35
      good! DB2 V8.2 依舊, DB2Dialect 有問題  回復  更多評論   

    • # re: hibernate中DB2數據庫的dialect分頁問題  Joice Posted @ 2010-09-07 22:00
      不幸被你言中,DB2 V7.X 已出來10年有余,我還在為前輩的bug而焦頭爛額!!!  回復  更多評論   

     
    Copyright © 楊杰榮 Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 免费无码又爽又刺激聊天APP| 亚洲国产高清在线一区二区三区| 少妇太爽了在线观看免费视频 | 国产a级特黄的片子视频免费| 精品国产亚洲男女在线线电影 | 免费无码精品黄AV电影| 久久WWW免费人成一看片| 免费在线观看h片| 亚洲精品视频免费在线观看| 国产亚洲情侣久久精品| 国产在亚洲线视频观看| 青草青草视频2免费观看| 亚洲国产精品成人久久久| 国产精品亚洲аv无码播放| 免费a在线观看播放| 免费真实播放国产乱子伦| 久久精品夜色噜噜亚洲A∨| 亚洲一区二区女搞男| 亚洲国产精品高清久久久| 午夜影视日本亚洲欧洲精品一区 | 一级毛片在线免费看| 曰批全过程免费视频播放网站| 国产在线观看麻豆91精品免费| 国产裸体美女永久免费无遮挡| 亚洲精品无码久久久久A片苍井空| 亚洲AV无码一区二区三区性色 | 亚洲精品无码mⅴ在线观看| 在线精品自拍亚洲第一区| 国产免费久久久久久无码| 午夜精品免费在线观看| 可以免费看黄视频的网站| 在线日本高清免费不卡| 亚洲人成网站免费播放| 114级毛片免费观看| 成人a免费α片在线视频网站| 人成午夜免费视频在线观看| 精品久久洲久久久久护士免费| 国产成人综合亚洲AV第一页| 亚洲情侣偷拍精品| 亚洲AV天天做在线观看| 亚洲一区二区三区丝袜|