我正在尝试通过使用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
抛出异常的行是它试图将tables对象强制转换为ResultSetImpl的行。
我在项目exajdbc.jar和mysql-connector.jar中都有两个jars
请帮助解决此问题的任何线索或提示。
我不确定你为什么写这个表达式:
((ResultSetImpl) tables).getConnection().getCatalog()
在此表达式中,您将tables
强制转换为特定于MySQL的结果集实现类,以使您可以访问其getConnection()
方法。尝试使用此代码从Exasol数据库读取数据时遇到错误,也许并不奇怪,因为在这种情况下tables
将是Exasol特定的结果集实现类。
当然,此结果集与传递到您的方法中的DatabaseMetaData
对象来自同一数据库连接吗?我希望getConnection()
对象的DatabaseMetaData
方法返回相同的连接。
尝试用以下内容替换上面的表达式:
metaData.getConnection().getCatalog()