2017-01-21 3 views
0

Это родное создать заявление для некоторых неизвестного носителя базы данныхКак анализировать имя таблицы из инструкции CREATE с помощью Hibernate?

String createStatement = "CREATE TABLE test_database.test_table " + 
"AS " + 
"( " + 
"var1, " + 
"var2 " + 
") " + 
"; " 
); 

Мне нужно разобрать эту строку test_database.test_table

Я не знаю заранее, что SQL аромата этого CREATE заявление является. Если бы я знал, я бы просто использовать что-то вроде

String table = createStatement.split(" ")[2]; 

Но выше решение не может работать во всех базах данных. Что делать, если какая-либо база данных допускает пробелы в имени таблицы? Поэтому я должен использовать Hibernate.

Как?

ответ

0

Я не думаю, что Hibernate может позаботиться обо всех ситуациях, особенно имея дело с чем-то вроде Transact-SQL или CREATE GLOBAL TEMPORARY TABLE или даже CREATE TEMPORARY TABLESPACE, а затем у вас есть AS, AS SELECT и даже PARALLEL COMPRESS AS SELECT после имени таблицы для рассмотрения.

В качестве альтернативы, однако, вы можете создать метод, который может получить имя таблицы из поставляемой строки SQL CREATE TABLE, которая, как я полагаю, будет охватывать большинство (если не всех) этих проблем. Ниже такой способ:

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), то вы, конечно, нужно будет дополнительно разобрать от фактического имени таблицы.

1

В целом, я не думаю, что вы можете сделать это без определенных предположений или рассмотрения каждого диалекта SQL, который вы хотите поддержать.

Hibernate сам поддерживает ряд диалектов SQL, и вы можете сделать вывод о многом из используемого диалекта. Однако org.hibernate.dialect.Dialect не предоставляет достаточной информации для анализа всех возможных исходных инструкций CREATE TABLE на выбранном диалекте.

Смежные вопросы