📄 db2dialect.java
字号:
//$Id: DB2Dialect.java,v 1.19 2005/04/04 14:49:03 oneovthafew Exp $package org.hibernate.dialect;import java.sql.Types;import org.hibernate.Hibernate;import org.hibernate.cfg.Environment;import org.hibernate.dialect.function.NoArgSQLFunction;import org.hibernate.dialect.function.StandardSQLFunction;/** * An SQL dialect for DB2. * @author Gavin King */public class DB2Dialect extends Dialect { 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") ); 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 && !hasDistinct(sql) ) { rownumber.append( sql.substring(orderByIndex) ); } rownumber.append(") as rownumber_,"); return rownumber.toString(); } public String getLimitString(String sql, boolean hasOffset) { 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 if ( hasDistinct(sql) ) { pagingSelect.append(" row_.* from ( ") //add another (inner) nested select .append( sql.substring(startOfSelect) ) //add the main query .append(" ) as row_"); //close off the inner nested select } else { pagingSelect.append( sql.substring( startOfSelect + 6 ) ); //add the main query } pagingSelect.append(" ) as temp_ where rownumber_ "); //add the restriction to the outer select if (hasOffset) { pagingSelect.append("between ?+1 and ?"); } else { pagingSelect.append("<= ?"); } return pagingSelect.toString(); } private static boolean hasDistinct(String sql) { return sql.toLowerCase().indexOf("select distinct")>=0; } public String getForUpdateString() { return " for update with rr"; } 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: literal = "'x'"; break; case Types.CHAR: literal = "'x'"; break; case Types.DATE: literal = "'2000-1-1'"; break; case Types.TIMESTAMP: literal = "'2000-1-1 00:00:00'"; case Types.TIME: literal = "'00:00:00'"; 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) ); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -