Java DatabaseMetaDatagetTables在Derby中找不到现有表

Java DatabaseMetaDatagetTables在Derby中找不到现有表,java,database,jdbc,derby,Java,Database,Jdbc,Derby,我正在用Java连接Derby数据库: public EmbeddedDerbyDataConnection(String name) throws SQLException { EmbeddedDataSource dataSource = new EmbeddedDataSource(); dataSource.setDatabaseName(name); dataSource.setCreateDatabase("create"); this.conne

我正在用Java连接Derby数据库:

public EmbeddedDerbyDataConnection(String name) throws SQLException {

    EmbeddedDataSource dataSource = new EmbeddedDataSource();
    dataSource.setDatabaseName(name);
    dataSource.setCreateDatabase("create");

    this.connection = dataSource.getConnection();
    init();
}
连接似乎还可以。然后我调用init方法,如果表还不存在,它将创建该表,并用一些默认数据填充该表:

private void init() throws SQLException {
    DatabaseMetaData metaData = this.connection.getMetaData();
    ResultSet rs = metaData.getTables(null, null, "mytable", null);
    if (rs.next()) {
        System.out.println("Table already exists.");
    } else {
        Statement stmt = this.connection.createStatement();
        String query = "CREATE TABLE mytable (...)";
        stmt.executeUpdate(query);
        stmt.close();

        stmt = this.connection.createStatement();
        query = "INSERT INTO mytable VALUES (...)";
        stmt.executeUpdate(query);
        stmt.close();
    }
}
在第一次创建EmbeddedDerbyDataConnection的对象之后,看起来还可以。我通过从mytable中选择*来测试它,它返回了我放在这个表中的默认数据

在第二次调用之后,我在线程main java.sql.SQLException:Table/View“mytable”中得到了:Exception,模式“APP”中已经存在。init方法中的ResultSet rs看起来是空的。但是,在从mytable调用SELECT*之后,数据就在那里,并且是正确的

我怎样才能解决这个问题?问题出在哪里

Derby的.getTables实现似乎区分大小写,而且Derby似乎还强制表名为大写

java.sql.SQLException:架构“APP”中已存在表/视图“MYTABLE”

因此,您可能需要使用以下内容

ResultSet rs=metaData.gettablesnall,null,mytable.toUpperCase,null;
为了获得匹配。

JDBC规范要求区分大小写,例如模式参数指定必须与存储在数据库中的表名匹配,因此如果数据库以大写形式存储不带引号的对象名,则模式也应为大写以匹配。