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