Java 如何使用Hibernate从CREATE语句解析表名?

Java 如何使用Hibernate从CREATE语句解析表名?,java,hibernate,Java,Hibernate,这是某个未知数据库载体的本机create语句 String createStatement = "CREATE TABLE test_database.test_table " + "AS " + "( " + "var1, " + "var2 " + ") " + "; " ); 我需要解析这个字符串test\u database.test\u表 我事先不知道这个CREATE语句是什么SQL风格的。如果我知道这一点,我会简单地使用 String table = c

这是某个未知数据库载体的本机create语句

String createStatement = "CREATE TABLE test_database.test_table " + 
"AS  " + 
"(  " + 
"var1,  " + 
"var2  " + 
")  " + 
";  " 
); 
我需要解析这个字符串test\u database.test\u表

我事先不知道这个CREATE语句是什么SQL风格的。如果我知道这一点,我会简单地使用

String table = createStatement.split(" ")[2]; 
但上述解决方案可能不适用于所有数据库。如果某个数据库允许表名中有空格,该怎么办?所以我必须使用Hibernate


怎么做

一般来说,我认为如果没有某些假设或考虑到您想要支持的每一种SQL方言,就无法做到这一点


Hibernate本身支持许多SQL方言,您可以从使用的方言中推断出很多东西。然而org.hibernate.dialogue.dialogue没有提供足够的信息来解析所选方言中所有可能的本机CREATE TABLE语句。

我认为hibernate无法处理所有情况,特别是在处理Transact-SQL或创建全局临时表,甚至创建临时表空间和然后,您有AS、AS选择、甚至是并行压缩,如表名称后面要考虑的。

但是,作为替代方案,您可以创建一个方法,该方法可以从提供的CREATETABLESQL字符串中检索表名,我相信该字符串将涵盖大部分(如果不是全部的话)问题。以下是这种方法:

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中所示,那么当然需要进一步解析实际的表名