import org.hibernate.dialect.Dialect; import org.hibernate.dialect.function.SQLFunctionTemplate; import org.hibernate.dialect.function.StandardSQLFunction; import org.hibernate.dialect.function.VarArgsSQLFunction; import org.hibernate.type.StandardBasicTypes; import java.sql.Types; public final class SQLiteDialect extends Dialect { public SQLiteDialect(){ registerColumnType(Types.NULL, "null"); registerColumnType(Types.INTEGER, "integer"); registerColumnType(Types.TINYINT, "integer"); registerColumnType(Types.SMALLINT , "integer"); registerColumnType(Types.BIGINT, "integer"); registerColumnType(Types.VARCHAR, "text"); registerColumnType(Types.CLOB, "text"); registerColumnType(Types.BLOB, "none"); registerColumnType(Types.REAL, "real"); registerColumnType(Types.DOUBLE, "real"); registerColumnType(Types.FLOAT, "real"); registerColumnType(Types.NUMERIC, "numeric"); registerColumnType(Types.DECIMAL, "numeric"); registerColumnType(Types.BOOLEAN, "numeric"); registerColumnType(Types.DATE, "numeric"); registerFunction("concat", new VarArgsSQLFunction(StandardBasicTypes.STRING, "", "||", "")); registerFunction("mod", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "?1 % ?2")); registerFunction("substr", new StandardSQLFunction("substr", StandardBasicTypes.STRING)); registerFunction("substring", new StandardSQLFunction("substr", StandardBasicTypes.STRING)); } public boolean supportsIdentityColumns() { return true; } public boolean hasDataTypeInIdentityColumn() { return false; } public String getIdentityColumnString() { // return "integer primary key autoincrement"; return "integer"; } public String getIdentitySelectString() { return "select last_insert_rowid()"; } @Override public boolean supportsLimit() { return true; } @Override protected String getLimitString(String query, boolean hasOffset) { return new StringBuffer(query.length() + 20). append(query). append(hasOffset ? " limit ? offset ?" : " limit ?"). toString(); } public boolean supportsTemporaryTables() { return true; } public String getCreateTemporaryTableString() { return "create temporary table if not exists"; } public boolean dropTemporaryTableAfterUse() { return false; } @Override public boolean supportsCurrentTimestampSelection() { return true; } @Override public boolean isCurrentTimestampSelectStringCallable() { return false; } @Override public String getCurrentTimestampSelectString() { return "select current_timestamp"; } @Override public boolean supportsUnionAll() { return true; } @Override public boolean hasAlterTable() { return false; } @Override public boolean dropConstraints() { return false; } @Override public String getAddColumnString() { return "add column"; } @Override public String getForUpdateString() { return ""; } @Override public boolean supportsOuterJoinForUpdate() { return false; } @Override public String getDropForeignKeyString() { throw new UnsupportedOperationException("No drop foreign key syntax supported by SQLiteDialect"); } @Override public String getAddForeignKeyConstraintString(String constraintName, String[] foreignKey, String referencedTable, String[] primaryKey, boolean referencesPrimaryKey) { throw new UnsupportedOperationException("No add foreign key syntax supported by SQLiteDialect"); } @Override public String getAddPrimaryKeyConstraintString(String constraintName) { throw new UnsupportedOperationException("No add primary key syntax supported by SQLiteDialect"); } @Override public boolean supportsIfExistsBeforeTableName() { return true; } @Override public boolean supportsCascadeDelete() { return false; } }
import org.hibernate.dialect.pagination.LimitHandler; import org.hibernate.dialect.pagination.LimitHelper; import org.hibernate.engine.spi.RowSelection; import java.sql.PreparedStatement; import java.sql.SQLException; public class SQLiteLimitHandler implements LimitHandler { public boolean supportsLimit() { return true; } public boolean supportsLimitOffset() { return true; } public String processSql(String sql, RowSelection selection) { if (LimitHelper.hasFirstRow(selection)) { return sql + " limit ? offset ?"; } else { return sql + " limit ?"; } } public int bindLimitParametersAtStartOfQuery(RowSelection selection, PreparedStatement statement, int index) throws SQLException { return 0; } public int bindLimitParametersAtEndOfQuery(RowSelection selection, PreparedStatement statement, int index) throws SQLException { return 0; } public void setMaxRows(RowSelection selection, PreparedStatement statement) throws SQLException { } }
import org.hibernate.boot.MetadataBuilder; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.spi.MetadataBuilderInitializer; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo; import org.hibernate.engine.jdbc.dialect.spi.DialectResolver; public class SQLiteMetadataBuilderInitializer implements MetadataBuilderInitializer { private static final SQLiteDialect dialect = new SQLiteDialect(); public void contribute(MetadataBuilder metadataBuilder, StandardServiceRegistry serviceRegistry) { } static private final DialectResolver resolver = new DialectResolver() { public Dialect resolveDialect(DialectResolutionInfo info) { if (info.getDatabaseName().equals("SQLite")) { return dialect; } return null; } }; }
import org.hibernate.JDBCException; import org.hibernate.exception.*; import org.hibernate.exception.spi.SQLExceptionConversionDelegate; import org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtracter; import org.hibernate.exception.spi.ViolatedConstraintNameExtracter; import org.hibernate.internal.util.JdbcExceptionHelper; import java.sql.SQLException; public class SQLiteSQLExceptionConversionDelegate implements SQLExceptionConversionDelegate { private static final int SQLITE_BUSY = 5; private static final int SQLITE_LOCKED = 6; private static final int SQLITE_IO_ERR = 10; private static final int SQLITE_PROTOCOL = 15; private static final int SQLITE_TOO_BIG = 18; private static final int SQLITE_CONSTRAINT = 19; private static final int SQLITE_MISMATCH = 20; private static final int SQLITE_NOT_ADB = 26; public JDBCException convert(SQLException sqlException, String message, String sql) { final int errorCode = JdbcExceptionHelper.extractErrorCode(sqlException); if (errorCode == SQLITE_CONSTRAINT) { final String constraintName = EXTRACTER.extractConstraintName(sqlException); return new ConstraintViolationException(message, sqlException, sql, constraintName); } else if (errorCode == SQLITE_TOO_BIG || errorCode == SQLITE_MISMATCH) { return new DataException(message, sqlException, sql); } else if (errorCode == SQLITE_BUSY || errorCode == SQLITE_LOCKED) { return new LockAcquisitionException(message, sqlException, sql); } else if ((errorCode >= SQLITE_IO_ERR && errorCode <= SQLITE_PROTOCOL) || errorCode == SQLITE_NOT_ADB) { return new JDBCConnectionException(message, sqlException, sql); } return new GenericJDBCException(message, sqlException, sql); } private static final ViolatedConstraintNameExtracter EXTRACTER = new TemplatedViolatedConstraintNameExtracter() { @Override protected String doExtractConstraintName(SQLException sqle) throws NumberFormatException { return extractUsingTemplate("constraint ", " failed", sqle.getMessage()); } }; }
鏈接不記得了,當初也是爲了解決問題,在谷歌上急匆匆找的發現能用,並改了些東西. 百毒搜東西真不行,各類結果都是重複粘貼貼,一點使用都沒有.java