2017-01-02 21 views
-1

私は新しいHibernateを使って新しいMySQLデータベースを(既存の構造を利用して)クローンしていますが、ここに示したコードでは例外がスローされています。これがなぜ起こっているのか?それを整理するために適切なデータを追加することHibernateでデータベースをクローンしようとしたときに例外が発生しました。


String existingDb = "SHOW TABLES IN crm_prod"; 
String dbName = "NewDb"; 
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 
jdbcTemplate.execute("CREATE DATABASE " + dbName); 

SqlRowSet result = jdbcTemplate.queryForRowSet(existingDb); 
while(result.next()) { 
    String tableName = result.getString(result.getMetaData().getColumnName(1)); 
    jdbcTemplate.execute("CREATE TABLE "+dbName+"." + tableName + 
     " LIKE crm_prod." + tableName); 
} 

org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [SHOW TABLES IN crm_prod]; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown table 'TABLE_NAMES' in information_schema 
at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:91) 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:419) 
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:474) 
at org.springframework.jdbc.core.JdbcTemplate.queryForRowSet(JdbcTemplate.java:515) 
at Tester.main(Tester.java:43) 
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown table 'TABLE_NAMES' in information_schema 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:408) 
at com.mysql.jdbc.Util.getInstance(Util.java:383) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1062) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4226) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4158) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2615) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2834) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2783) 
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1569) 
at com.mysql.jdbc.Field.getCollation(Field.java:491) 
at com.mysql.jdbc.ResultSetMetaData.isCaseSensitive(ResultSetMetaData.java:569) 
at com.sun.rowset.CachedRowSetImpl.initMetaData(CachedRowSetImpl.java:722) 
at com.sun.rowset.CachedRowSetImpl.populate(CachedRowSetImpl.java:639) 
at org.springframework.jdbc.core.SqlRowSetResultSetExtractor.createSqlRowSet(SqlRowSetResultSetExtractor.java:82) 
at org.springframework.jdbc.core.SqlRowSetResultSetExtractor.extractData(SqlRowSetResultSetExtractor.java:65) 
at org.springframework.jdbc.core.SqlRowSetResultSetExtractor.extractData(SqlRowSetResultSetExtractor.java:46) 
at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:463) 
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:408) 
... 3 more 
+1

これを行うためにコードを書くのを止めているのは何ですか? – Andreas

答えて

0

よし: のDatabaseMetaDataからあなたは、テーブル&列などの詳細を抽出することができます。

String catalog   = null; 
    String schemaPattern = null; 
    String tableNamePattern = null; 
    String[] types   = null; 
    String columnNamePattern = null; 

    DatabaseMetaData databaseMetaData = con.getMetaData(); 
    result = databaseMetaData.getTables(catalog, schemaPattern, tableNamePattern, types); 
    while(result.next()) { 
     String tableName =result.getString(3); 
     result1= databaseMetaData.getColumns(catalog, schemaPattern, tableName, columnNamePattern); 
     while(result1.next()) { 
      String columnName = result1.getString(4); 
      String columnType = result1.getString(6);    
     } 
    } 
For More info : http://tutorials.jenkov.com/jdbc/databasemetadata.html 
+1

このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューから](/レビュー/低品質の投稿/ 14761158) – nkjt

+0

最初の回答が更新されました。 –

1

私は以下のコードで目標を達成しました。

SqlRowSet createTable = jdbcTemplate.queryForRowSet(
       "SELECT * FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`='" + cloneDBName + "'"); 
     while (createTable.next()) { 
      String tableName = createTable.getString(createTable.getMetaData().getColumnName(3)); 
      jdbcTemplate 
        .execute("CREATE TABLE " + dbName + "." + tableName + " LIKE " + cloneDBName + "." + tableName); 
     } 
関連する問題