如何从内存数据库中检索列名?

时间:2013-05-03 12:12:23

标签: java jdbc hsqldb derby h2

这是令我头疼的代码:

  public List<String> listColumnsForTable(String tableName) throws SQLException {
    List<String> columns = new ArrayList<String>();
    DatabaseMetaData metadata = _connection.getMetaData();
    ResultSet resultSet = metadata.getColumns(null, null, tableName, null);
    while (resultSet.next())
      columns.add(resultSet.getString("COLUMN_NAME"));
    return columns;
  }

此代码适用于SQL Server (我没有检查过MySQL,Oracle或其他),但我需要在内存数据库中运行一些集成测试。我尝试的所有数据库(h2,hsqldb和derby)失败

这是the link on github

如果你想要完整项目(测试h2,hsqldb,derby和sql server),请执行以下操作:

git clone git://github.com/sensui/InMemoryColumns.git
cd InMemoryColumns
gradlew

将自动下载所有依赖项。如果要查看库版本,请查看build.gradle脚本。

现在在您喜欢的IDE(eclipse或idea)中导入项目。

DatabaseMetadataCheckerTests班级(canListColumnsForTablecanCheckIfColumnsExistInTable)提供了测试。

通常你不应该修改它们。我已经创建了 4个测试类,它们为每个内存数据库提供了连接细节,你需要运行它们(DatabaseMetadataCheckerTests是抽象的,所以你不运行它。)

注意: 当/如果您找到解决方案而不是该特定数据库的测试将通过。 您只需扩展DatabaseMetadataCheckerTests类并提供连接详细信息(查看其他测试),即可轻松尝试其他数据库,如Oracle或MySQL。

问题已解决

表名称和列名称应位于大写中。查看this commit了解详情。

1 个答案:

答案 0 :(得分:7)

H2,HSQLDB(以及Oracle和DB2)符合SQL标准,因此不带引号的对象名称被折叠成大写(SQL Server不会这样做,它会保留您使用的任何情况,加上它可能被配置为不是字符串比较区分大小写。)

create table foo (id integer)FOO存储为系统目录中的列名ID

因此,您需要将表名以大写形式传递给JDBC API调用。

关于将其移植到其他DBMS的说明:

Postgres不符合此处的标准,并将所有内容折叠为小写

对于MySQL,它没有明确的答案。它取决于各种配置设置(以及存储引擎和文件系统),因此您永远无法确定不带引号的表名将如何实际存储在系统中。