0

我正在尝试通过使用 jdbc DatabaseMetadata 和 ResultSet 进行查询来构建 DatabaseTable(我的自定义对象)对象。

如果我在 MySQL 数据库上运行下面的代码,它工作得非常好,但是在尝试 Exasol 数据库时它会失败并出现异常。

 private DatabaseTableColumnMetadata getTableAndColumnNames(DatabaseMetaData metaData)
        throws SQLException {
        ResultSet tables = metaData.getTables(null,null,"%",null);
        while (tables.next()){
            if (tables.getString("TABLE_TYPE").equalsIgnoreCase("TABLE")
                && ((ResultSetImpl) tables).getConnection().getCatalog()
                .equals(tables.getString("TABLE_CAT"))) {

                     DatabaseTable table = DatabaseTable.builder().name(tables.getString("TABLE_NAME")).schema(tables.getString("TYPE_SCHEM")).build();
             }
        }
}

抛出的异常如下

com.exasol.jdbc.EXAResultSet cannot be cast to com.mysql.cj.jdbc.result.ResultSetImpl","message":"com.exasol.jdbc.EXAResultSet cannot be cast to com.mysql.cj.jdbc.result.ResultSetImpl","name":"java.lang.ClassCastException

抛出的异常发生在它试图将对象转换为ResultSetImpl的位置。

我的项目 exajdbc.jar 和 mysql-connector.jar 中有两个 jar

任何帮助或线索来解决这个问题请。

4

1 回答 1

1

我不确定你为什么写这个表达式:

     ((ResultSetImpl) tables).getConnection().getCatalog()

在此表达式中,您将转换tables为特定于 MySQL 的结果集实现类,以便您可以访问其getConnection()方法。尝试使用此代码从 Exasol 数据库读取数据时遇到错误可能并不奇怪,因为在这种情况下tables将是一个特定于 Exasol 的结果集实现类。

这个结果集肯定来自与DatabaseMetaData传递给您的方法的对象相同的数据库连接吗?我希望对象的getConnection()方法DatabaseMetaData返回相同的连接。

尝试将上面的表达式替换为以下内容:

     metaData.getConnection().getCatalog()
于 2020-02-27T18:01:45.663 回答