com.exasol.jdb c .EXAResultSet не может быть приведен к com. mysql .cj.jdb c .result.ResultSetImpl java .lang.ClassCastException - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь создать объект DatabaseTable (мой пользовательский объект), выполняя запросы с использованием jdb c DatabaseMetadata и ResultSet.

Приведенный ниже код прекрасно работает, если я запускаю его для базы данных 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 .

В моем проекте есть оба jar-файла exajdb c .jar, а также mysql -connector. jar

Любая помощь или подсказка для решения этой проблемы, пожалуйста.

1 Ответ

1 голос
/ 27 февраля 2020

Я не уверен, почему вы написали это выражение:

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

В этом выражении вы переводите tables в MySQL -specifi c класс реализации набора результатов, просто чтобы вы могли получить доступ к его getConnection() методу. Возможно, неудивительно, что вы получаете сообщение об ошибке при попытке использовать этот код для чтения данных из базы данных Exasol, потому что в этой ситуации tables будет специфичным для Exasol c классом реализации набора результатов.

Конечно, этот набор результатов происходит из того же соединения с базой данных, что и объект DatabaseMetaData, который передается в ваш метод? Я ожидаю, что метод getConnection() объекта DatabaseMetaData возвратит то же соединение.

Попробуйте заменить приведенное выше выражение следующим:

     metaData.getConnection().getCatalog()
...