diff --git a/tools/hibernate-dialect/.gitignore b/tools/hibernate-dialect/.gitignore
new file mode 100644
index 0000000000..3f3319fa32
--- /dev/null
+++ b/tools/hibernate-dialect/.gitignore
@@ -0,0 +1,9 @@
+.classpath
+.project
+.settings
+mvn.out
+target/*
+/target/
+*.log
+/LICENSE
+/NOTICE
diff --git a/tools/hibernate-dialect/Makefile b/tools/hibernate-dialect/Makefile
new file mode 100644
index 0000000000..006c848ff1
--- /dev/null
+++ b/tools/hibernate-dialect/Makefile
@@ -0,0 +1,33 @@
+# @@@ START COPYRIGHT @@@
+# #
+# # Licensed to the Apache Software Foundation (ASF) under one
+# # or more contributor license agreements. See the NOTICE file
+# # distributed with this work for additional information
+# # regarding copyright ownership. The ASF licenses this file
+# # to you under the Apache License, Version 2.0 (the
+# # "License"); you may not use this file except in compliance
+# # with the License. You may obtain a copy of the License at
+# #
+# # http://www.apache.org/licenses/LICENSE-2.0
+# #
+# # Unless required by applicable law or agreed to in writing,
+# # software distributed under the License is distributed on an
+# # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# # KIND, either express or implied. See the License for the
+# # specific language governing permissions and limitations
+# # under the License.
+# #
+# # @@@ END COPYRIGHT @@@
+
+
+.NOTPARALLEL: all
+
+all: build_all
+
+build_all:
+ echo "$(MAVEN) package -DskipTests"
+ set -o pipefail && $(MAVEN) package -DskipTests
+
+clean:
+ $(MAVEN) clean
+ $(RM) -r target/*
diff --git a/tools/hibernate-dialect/README.txt b/tools/hibernate-dialect/README.txt
new file mode 100644
index 0000000000..71575245d8
--- /dev/null
+++ b/tools/hibernate-dialect/README.txt
@@ -0,0 +1,20 @@
+Trafodion hibernate dialect
+===============================
+This is a tool for hibernate to use trafodion.
+This tool now support hibernate version 4.x .
+To use this tool, you should make all ,then load the jar file to your project,and add following config to you hibernate.cfg.xml file:
+
+org.hibernate.dialect.TrafodionDialect
+
+ABOUT HIBERNATE:
+
+Hibernate ORM enables developers to more easily write applications whose data outlives the application process. As an Object/Relational Mapping (ORM) framework, Hibernate is concerned with data persistence as it applies to relational databases (via JDBC).
+
+benefit:
+
+Hibernate is one of the most common ORM frameworks and has a very high rate of use in the Java Web project, supporting it to improve the usability of trafodion in OLTP.
+
+To build:
+>cd
+> make all
+
diff --git a/tools/hibernate-dialect/pom.xml b/tools/hibernate-dialect/pom.xml
new file mode 100644
index 0000000000..51b4e85bf1
--- /dev/null
+++ b/tools/hibernate-dialect/pom.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+4.0.0
+
+ org.trafodion
+ hibernate-dialect
+ ${env.TRAFODION_VER}
+ jar
+
+ Hibernate dialect tool jar
+ http://wiki.trafodion.org
+
+
+ UTF-8
+
+
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+ org.hibernate
+ hibernate-core
+ 4.3.10.Final
+
+
+
diff --git a/tools/hibernate-dialect/src/main/java/org/trafodion/hibernate/dialect/TrafodionDialect.java b/tools/hibernate-dialect/src/main/java/org/trafodion/hibernate/dialect/TrafodionDialect.java
new file mode 100644
index 0000000000..886b644ac6
--- /dev/null
+++ b/tools/hibernate-dialect/src/main/java/org/trafodion/hibernate/dialect/TrafodionDialect.java
@@ -0,0 +1,285 @@
+// @@@ START COPYRIGHT @@@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+// @@@ END COPYRIGHT @@@
+package org.trafodion.hibernate.dialect;
+
+import java.sql.Types;
+
+import org.hibernate.cfg.Environment;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.function.NoArgSQLFunction;
+import org.hibernate.dialect.function.NvlFunction;
+import org.hibernate.dialect.function.SQLFunctionTemplate;
+import org.hibernate.dialect.function.StandardSQLFunction;
+import org.hibernate.dialect.function.VarArgsSQLFunction;
+import org.hibernate.type.StandardBasicTypes;
+import org.hibernate.type.descriptor.sql.BitTypeDescriptor;
+import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
+
+
+public class TrafodionDialect extends Dialect {
+
+ private static final int PARAM_LIST_SIZE_LIMIT = 1000;
+
+ public TrafodionDialect() {
+ super();
+ registerCharacterTypeMappings();
+ registerNumericTypeMappings();
+ registerDateTimeTypeMappings();
+ registerLargeObjectTypeMappings();
+ registerReverseHibernateTypeMappings();
+ registerFunctions();
+ registerDefaultProperties();
+ }
+
+ protected void registerCharacterTypeMappings() {
+ registerColumnType( Types.CHAR, "char(1)" );
+ registerColumnType( Types.VARCHAR, "varchar($l)" );
+ }
+
+ protected void registerNumericTypeMappings() {
+ registerColumnType( Types.BIT, "numeric(1,0)" );
+ registerColumnType( Types.TINYINT, "numeric(1,0)" );
+ registerColumnType( Types.SMALLINT, "smallint" );
+ registerColumnType( Types.BIGINT, "largeint" );
+ registerColumnType( Types.INTEGER, "integer" );
+
+ registerColumnType( Types.FLOAT, "real" );
+ registerColumnType( Types.DOUBLE, "double precision" );
+ registerColumnType( Types.NUMERIC, "numeric($p,$s)" );
+ registerColumnType( Types.DECIMAL, "decimal($p,$s)" );
+
+ registerColumnType( Types.BOOLEAN, "numeric(1,0)" );
+ }
+
+ protected void registerDateTimeTypeMappings() {
+ registerColumnType( Types.DATE, "date" );
+ registerColumnType( Types.TIME, "time" );
+ registerColumnType( Types.TIMESTAMP, "timestamp" );
+ }
+
+ protected void registerLargeObjectTypeMappings() {
+ registerColumnType( Types.BINARY, "blob" );
+ registerColumnType( Types.VARBINARY, "blob" );
+
+ registerColumnType( Types.BLOB, "blob" );
+ registerColumnType( Types.CLOB, "clob" );
+
+ registerColumnType( Types.LONGVARCHAR, "clob" );
+ registerColumnType( Types.LONGVARBINARY, "blob" );
+ }
+
+ protected void registerReverseHibernateTypeMappings() {
+ }
+
+ protected void registerFunctions() {
+ registerFunction( "abs", new StandardSQLFunction("abs") );
+ registerFunction( "sign", new StandardSQLFunction("sign", StandardBasicTypes.INTEGER) );
+
+ registerFunction( "acos", new StandardSQLFunction("acos", StandardBasicTypes.DOUBLE) );
+ registerFunction( "asin", new StandardSQLFunction("asin", StandardBasicTypes.DOUBLE) );
+ registerFunction( "atan", new StandardSQLFunction("atan", StandardBasicTypes.DOUBLE) );
+ registerFunction( "bitand", new StandardSQLFunction("bitand") );
+ registerFunction( "cos", new StandardSQLFunction("cos", StandardBasicTypes.DOUBLE) );
+ registerFunction( "cosh", new StandardSQLFunction("cosh", StandardBasicTypes.DOUBLE) );
+ registerFunction( "exp", new StandardSQLFunction("exp", StandardBasicTypes.DOUBLE) );
+ registerFunction( "log", new StandardSQLFunction("log", StandardBasicTypes.DOUBLE) );
+ registerFunction( "sin", new StandardSQLFunction("sin", StandardBasicTypes.DOUBLE) );
+ registerFunction( "sinh", new StandardSQLFunction("sinh", StandardBasicTypes.DOUBLE) );
+ registerFunction( "stddev", new StandardSQLFunction("stddev", StandardBasicTypes.DOUBLE) );
+ registerFunction( "sqrt", new StandardSQLFunction("sqrt", StandardBasicTypes.DOUBLE) );
+ registerFunction( "tan", new StandardSQLFunction("tan", StandardBasicTypes.DOUBLE) );
+ registerFunction( "tanh", new StandardSQLFunction("tanh", StandardBasicTypes.DOUBLE) );
+ registerFunction( "variance", new StandardSQLFunction("variance", StandardBasicTypes.DOUBLE) );
+
+ registerFunction( "round", new StandardSQLFunction("round") );
+ registerFunction( "trunc", new StandardSQLFunction("trunc") );
+ registerFunction( "ceiling", new StandardSQLFunction("ceiling") );
+ registerFunction( "floor", new StandardSQLFunction("floor") );
+
+ registerFunction( "char", new StandardSQLFunction("char", StandardBasicTypes.CHARACTER) );
+ registerFunction( "lower", new StandardSQLFunction("lower") );
+ registerFunction( "ltrim", new StandardSQLFunction("ltrim") );
+ registerFunction( "rtrim", new StandardSQLFunction("rtrim") );
+ registerFunction( "upper", new StandardSQLFunction("upper") );
+ registerFunction( "ascii", new StandardSQLFunction("ascii", StandardBasicTypes.INTEGER) );
+
+ registerFunction( "current_date", new NoArgSQLFunction("current_date", StandardBasicTypes.DATE, false) );
+ registerFunction( "current_time", new NoArgSQLFunction("current_time", StandardBasicTypes.TIME, false) );
+ registerFunction( "current_timestamp", new NoArgSQLFunction("current_timestamp", StandardBasicTypes.TIMESTAMP, false) );
+
+ registerFunction( "user", new NoArgSQLFunction("user", StandardBasicTypes.STRING, false) );
+
+ // Multi-param string dialect functions...
+ registerFunction( "concat", new VarArgsSQLFunction(StandardBasicTypes.STRING, "", "||", "") );
+ registerFunction( "instr", new StandardSQLFunction("instr", StandardBasicTypes.INTEGER) );
+ registerFunction( "lpad", new StandardSQLFunction("lpad", StandardBasicTypes.STRING) );
+ registerFunction( "replace", new StandardSQLFunction("replace", StandardBasicTypes.STRING) );
+ registerFunction( "rpad", new StandardSQLFunction("rpad", StandardBasicTypes.STRING) );
+ registerFunction( "substr", new StandardSQLFunction("substr", StandardBasicTypes.STRING) );
+ registerFunction( "translate", new StandardSQLFunction("translate", StandardBasicTypes.STRING) );
+
+ registerFunction( "substring", new StandardSQLFunction( "substr", StandardBasicTypes.STRING ) );
+ registerFunction( "locate", new SQLFunctionTemplate( StandardBasicTypes.INTEGER, "instr(?2,?1)" ) );
+ registerFunction( "coalesce", new NvlFunction() );
+
+ // Multi-param numeric dialect functions...
+ registerFunction( "atan2", new StandardSQLFunction("atan2", StandardBasicTypes.FLOAT) );
+ registerFunction( "mod", new StandardSQLFunction("mod", StandardBasicTypes.INTEGER) );
+ registerFunction( "nvl", new StandardSQLFunction("nvl") );
+ registerFunction( "power", new StandardSQLFunction("power", StandardBasicTypes.FLOAT) );
+
+ // Multi-param date dialect functions...
+ registerFunction( "add_months", new StandardSQLFunction("add_months", StandardBasicTypes.DATE) );
+ }
+
+ protected void registerDefaultProperties() {
+ getDefaultProperties().setProperty( Environment.USE_STREAMS_FOR_BINARY, "true" );
+ getDefaultProperties().setProperty( Environment.STATEMENT_BATCH_SIZE, DEFAULT_BATCH_SIZE );
+ getDefaultProperties().setProperty( Environment.USE_GET_GENERATED_KEYS, "true" );
+ }
+
+ @Override
+ protected SqlTypeDescriptor getSqlTypeDescriptorOverride(int sqlCode) {
+ return sqlCode == Types.BOOLEAN ? BitTypeDescriptor.INSTANCE : super.getSqlTypeDescriptorOverride( sqlCode );
+ }
+
+ @Override
+ public String getCrossJoinSeparator() {
+ return " cross join ";
+ }
+
+/* @Override
+ public LimitHandler getLimitHandler() {
+ return LIMIT_HANDLER;
+ }
+*/
+ @Override
+ public String getLimitString(String sql, boolean hasOffset) {
+ sql = sql.trim();
+ return sql + (hasOffset ? " limit ? " : " limit ?");
+ }
+
+ @Override
+ public String getCurrentTimestampSelectString() {
+ return "select current_timestamp from (values(1)) x";
+ }
+
+ @Override
+ public String getCurrentTimestampSQLFunctionName() {
+ return "current_timestamp";
+ }
+
+
+ @Override
+ public String getAddColumnString() {
+ return "add ";
+ }
+
+ @Override
+ public String getSequenceNextValString(String sequenceName) {
+ return "select seqnum(" + sequenceName + ") from (values(1)) x";
+ }
+
+ @Override
+ public String getCreateSequenceString(String sequenceName) {
+ return "create sequence " + sequenceName;
+ }
+
+ @Override
+ public String getDropSequenceString(String sequenceName) {
+ return "drop sequence " + sequenceName;
+ }
+
+ @Override
+ public boolean dropConstraints() {
+ return false;
+ }
+
+ @Override
+ public boolean supportsSequences() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsPooledSequences() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsLimit() {
+ return true;
+ }
+
+ @Override
+ public String getQuerySequencesString() {
+ return " get all sequences";
+ }
+
+ @Override
+ public boolean supportsUnionAll() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsCommentOn() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsCurrentTimestampSelection() {
+ return true;
+ }
+
+ @Override
+ public boolean isCurrentTimestampSelectStringCallable() {
+ return false;
+ }
+
+ @Override
+ public boolean supportsEmptyInList() {
+ return false;
+ }
+
+ @Override
+ public boolean supportsExistsInSelect() {
+ return false;
+ }
+
+ @Override
+ public int getInExpressionCountLimit() {
+ return PARAM_LIST_SIZE_LIMIT;
+ }
+
+ @Override
+ public boolean forceLobAsLastValue() {
+ return false;
+ }
+
+ @Override
+ public boolean useFollowOnLocking() {
+ return false;
+ }
+
+ @Override
+ public String getNotExpression( String expression ) {
+ return "not (" + expression + ")";
+ }
+}