java hibernate方言_Hibernate SQLite方言

以下代码有参考过github上国外某位大佬的,在发文的最新稳定版Hibernate上是可用的,有时间再仔细分析一下

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());

}

};

}

连接不记得了,当初也是为了解决问题,在谷歌上急匆匆找的发现能用,并改了些东西. 百毒搜东西真不行,各种结果都是重复粘贴贴,一点使用都没有.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值