kelefa  
          大千世界中,唯一缺乏的就是人類的注意力。
          日歷
          <2006年12月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456
          統(tǒng)計
          • 隨筆 - 11
          • 文章 - 0
          • 評論 - 28
          • 引用 - 0

          導(dǎo)航

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

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

          ????
          /**
          ?????*?設(shè)置分頁,?pageNo或pageList<=0時返回所有記錄
          ?????*?
          ?????*?
          @param?pageNo
          ?????*??????????頁數(shù),?從1開始,?<=0時返回所有記錄
          ?????*?
          @param?pageList
          ?????*??????????每頁記錄數(shù),?<=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?);
          ????????}

          ????}


          ????
          /**
          ?????*?設(shè)置分頁,?pageNo或pageList<=0時返回所有記錄
          ?????*?
          ?????*?
          @param?pageNo
          ?????*??????????頁數(shù),?從1開始,?<=0時返回所有記錄
          ?????*?
          @param?pageList
          ?????*??????????每頁記錄數(shù),?<=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語句, 發(fā)現(xiàn)是這樣的sql:
          ?
          select?*?from?T?fetch?first?600?rows?only

          ?我想fetch first 600 rows only大概就是頁面卡住的原因了
          ?
          ?再看org.hibernate.dialect.DB2Dialect的源碼, 發(fā)現(xiàn)數(shù)據(jù)庫拋出異常是因為:
          ?1. DB2Dialect生成的sql有兩個order by, 應(yīng)該只保留over()里面的order by
          ?2. 當(dāng)sql含有select distinct的時候, 要替換表別名為row_, 替換字段名為hibernate生成的字段名別名
          ?
          ?把org.hibernate.dialect.DB2Dialect進(jìn)行修改后, 目前運行還沒有發(fā)現(xiàn)什么問題.
          ?
          ?db2的版本好像7.x, 是不是版本太低, 或jdbc的版本問題呢, 也許hibernate的org.hibernate.dialect.DB2Dialect是沒有問題的, 呵呵.
          ?各位老大有沒有這方面的經(jīng)驗, 有更好的解決方法請回復(fù), 非常感謝!
          ?
          ?修改的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 楊杰榮 閱讀(3908) 評論(3)  編輯  收藏 所屬分類: webwork,hibernate
          評論:
          • # re: hibernate中DB2數(shù)據(jù)庫的dialect分頁問題  s Posted @ 2006-12-27 14:25
            fdsfsdf  回復(fù)  更多評論   

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

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

           
          Copyright © 楊杰榮 Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 肥乡县| 涿州市| 措勤县| 青神县| 禹州市| 潢川县| 灵寿县| 泾源县| 蒙自县| 南丹县| 晋江市| 海城市| 红河县| 常熟市| 津南区| 沐川县| 南昌县| 乌兰察布市| 南汇区| 那曲县| 宁阳县| 米林县| 富阳市| 新化县| 乌什县| 武平县| 德江县| 都安| 大港区| 淮安市| 濮阳县| 枣阳市| 民乐县| 宁夏| 杭锦旗| 大名县| 定襄县| 绍兴市| 德令哈市| 绵阳市| 沈阳市|