这是某个未知数据库载体的本机create语句
String createStatement = "CREATE TABLE test_database.test_table " +
"AS " +
"( " +
"var1, " +
"var2 " +
") " +
"; "
);
我需要解析这个字符串test_database.test_table
我事先并不知道这个CREATE语句的SQL风格。如果我知道这一点,我会简单地使用类似
的内容String table = createStatement.split(" ")[2];
但上述解决方案可能无法在所有数据库中使用。如果某个数据库允许表名空白怎么办?所以我必须使用Hibernate。
如何?
答案 0 :(得分:1)
一般来说,我不认为你可以在没有某些假设或考虑你想要支持的每一种SQL方言的情况下做到这一点。
Hibernate本身支持许多SQL方言,你可以从使用过的方言中推断出很多东西。但是,org.hibernate.dialect.Dialect
没有提供足够的信息来解析所选方言中所有可能的本地CREATE TABLE
语句。
答案 1 :(得分:0)
我不认为Hibernate可以处理所有情况,特别是在处理类似Transact-SQL或CREATE GLOBAL TEMPORARY TABLE或甚至CREATE TEMPORARY TABLESPACE之类的东西时,你有AS,AS SELECT,甚至PARALLEL COMPRESS AS选择表名后的SELECT。
作为替代方案,您可以创建一个方法,该方法可以从提供的CREATE TABLE SQL字符串中检索表名,我相信这将覆盖大多数(如果不是全部)这些问题。以下是这样一种方法:
public String getTableNameFromCreate(final String sqlString) {
// Always rememeber...we're only trying to get the table
// name from the SQL String. We really don't care anything
// about the rest of the SQL string.
String tableName;
String wrkStrg = sqlString.replace("[", "").replace("]", "").trim();
// Is "CREATE TABLE" only
if (wrkStrg.startsWith("CREATE TABLE ")) {
wrkStrg = wrkStrg .substring(13).trim();
}
else if (wrkStrg.startsWith("CREATE GLOBAL TEMPORARY TABLE ")) {
wrkStrg = wrkStrg .substring(30).trim();
}
else if (wrkStrg.startsWith("CREATE TEMPORARY TABLESPACE ")) {
wrkStrg = wrkStrg .substring(28).trim();
}
// Is it Create Table ... AS, AS SELECT, PARALLEL COMPRESS AS,
// or PARALLEL COMPRESS AS SELECT?
if (wrkStrg.toUpperCase().contains(" PARALLEL COMPRESS ")) {
wrkStrg = wrkStrg.replace(" parallel compress ", " PARALLEL COMPRESS ");
tableName = wrkStrg.substring(0, wrkStrg.indexOf(" PARALLEL COMPRESS ")).trim();
}
else if (wrkStrg.toUpperCase().contains(" AS ")) {
wrkStrg = wrkStrg.replace(" as ", " AS ");
tableName = wrkStrg.substring(0, wrkStrg.indexOf(" AS ")).trim();
}
// Nope...none of that in the SQL String.
else {
tableName = wrkStrg.substring(0, wrkStrg.indexOf("(")).trim();
}
// return but remove quotes first if any...
return tableName.replace("\"","").replace("'", "");
}
如果数据库名称附加到表名称中,如示例(test_database.test_table),那么您当然需要进一步解析实际的表名。