我正在将h2 (h2-1.4.186.jar)数据库用于Java应用程序。 我已经创建了2个数据库,一个是我用于许多任务的支持数据库。 在这些任务之一中,我需要另一个数据库中的表(作为表f的选择f.field,h.field加入表h ecc ...中创建)。 因此,我使用了“创建链接表”。 如果我从浏览器控制台执行查询,则可以使用,但是如果我使用java方法,则无法使用。 方法如下:

private void createTable()
{

    String linkedTable="create force linked table if not exists "+TABLE_NAME+"('org.h2.Driver','jdbc:h2:../GLOBALDB/general','user','pass','("+getQuery()+")')";
    try{

        Connection conn=GenericDatabaseConnections.getConnectionDBThreads();
        Statement sta=conn.createStatement();

        try{

            sta.execute(linkedTable);
            sta.execute("SELECT * FROM "+TABLE_NAME);

        }catch(Exception e){
            e.printStackTrace();
        }


        sta.close();
        conn.close();

    }catch(Exception e){
        e.printStackTrace();
    }

}

我得到以下例外:

org.h2.jdbc.JdbcSQLException: Error accessing linked table with SQL statement "SELECT * FROM (select * from film) T", cause: "org.h2.jdbc.JdbcSQLException: Table ""(select * from film)(org.h2.jdbc.JdbcSQLException: Table """"FILM"""" not found; SQL statement:
SELECT * FROM (select * from film) T WHERE 1=0 [42102-186])"" not found [42102-186]"; SQL statement:
SELECT * FROM film [90111-186]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
    at org.h2.message.DbException.get(DbException.java:168)
    at org.h2.table.TableLink.wrapException(TableLink.java:462)
    at org.h2.index.LinkedIndex.find(LinkedIndex.java:127)
    at org.h2.index.BaseIndex.find(BaseIndex.java:127)
    at org.h2.index.IndexCursor.find(IndexCursor.java:159)
    at org.h2.table.TableFilter.next(TableFilter.java:329)
    at org.h2.command.dml.Select.queryFlat(Select.java:574)
    at org.h2.command.dml.Select.queryWithoutCache(Select.java:686)
    at org.h2.command.dml.Query.query(Query.java:322)
    at org.h2.command.dml.Query.query(Query.java:290)
    at org.h2.command.dml.Query.query(Query.java:36)
    at org.h2.command.CommandContainer.query(CommandContainer.java:90)
    at org.h2.command.Command.executeQuery(Command.java:197)
    at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:179)
    at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:158)
    at TableManager.createTable(TableManager.java:335)
    at TableManager.task(TableManager.java:33)
    at TaskManager.startTask(TaskManager.java:38)
    at main.Main.main(Main.java:77)
Caused by: org.h2.jdbc.JdbcSQLException: Table "(select * from film)(org.h2.jdbc.JdbcSQLException: Table ""FILM"" not found; SQL statement:
SELECT * FROM (select * from film) T WHERE 1=0 [42102-186])" not found [42102-186]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
    at org.h2.message.DbException.get(DbException.java:168)
    at org.h2.table.TableLink.readMetaData(TableLink.java:196)
    at org.h2.table.TableLink.connect(TableLink.java:98)
    at org.h2.table.TableLink.<init>(TableLink.java:78)
    at org.h2.schema.Schema.createTableLink(Schema.java:607)
    at org.h2.command.ddl.CreateLinkedTable.update(CreateLinkedTable.java:77)
    at org.h2.engine.MetaRecord.execute(MetaRecord.java:58)
    at org.h2.engine.Database.open(Database.java:732)
    at org.h2.engine.Database.openDatabase(Database.java:266)
    at org.h2.engine.Database.<init>(Database.java:260)
    at org.h2.engine.Engine.openSession(Engine.java:60)
    at org.h2.engine.Engine.openSession(Engine.java:167)
    at org.h2.engine.Engine.createSessionAndValidate(Engine.java:145)
    at org.h2.engine.Engine.createSession(Engine.java:128)
    at org.h2.engine.Engine.createSession(Engine.java:26)
    at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:347)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:108)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:92)
    at org.h2.Driver.connect(Driver.java:72)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at databaseconnection.GenericDatabaseConnections.getConnectionDBThreads(GenericDatabaseConnections.java:46)
    at TableManager.createTable(TableManager.java:329)
    ... 3 more
Caused by: org.h2.jdbc.JdbcSQLException: Table "FILM" not found; SQL statement:
SELECT * FROM (select * from film) T WHERE 1=0 [42102-186]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
    at org.h2.message.DbException.get(DbException.java:179)
    at org.h2.message.DbException.get(DbException.java:155)
    at org.h2.command.Parser.readTableOrView(Parser.java:5251)
    at org.h2.command.Parser.readTableFilter(Parser.java:1235)
    at org.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1874)
    at org.h2.command.Parser.parseSelectSimple(Parser.java:1983)
    at org.h2.command.Parser.parseSelectSub(Parser.java:1868)
    at org.h2.command.Parser.parseSelectUnion(Parser.java:1689)
    at org.h2.command.Parser.readTableFilter(Parser.java:1159)
    at org.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1874)
    at org.h2.command.Parser.parseSelectSimple(Parser.java:1983)
    at org.h2.command.Parser.parseSelectSub(Parser.java:1868)
    at org.h2.command.Parser.parseSelectUnion(Parser.java:1689)
    at org.h2.command.Parser.parseSelect(Parser.java:1677)
    at org.h2.command.Parser.parsePrepared(Parser.java:433)
    at org.h2.command.Parser.parse(Parser.java:305)
    at org.h2.command.Parser.parse(Parser.java:277)
    at org.h2.command.Parser.prepareCommand(Parser.java:242)
    at org.h2.engine.Session.prepareLocal(Session.java:446)
    at org.h2.engine.Session.prepareCommand(Session.java:388)
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1189)
    at org.h2.jdbc.JdbcStatement.executeQuery(JdbcStatement.java:73)
    at org.h2.table.TableLink.readMetaData(TableLink.java:173)
    ... 24 more

最后,如果我在打开浏览器控制台时使用Java进行操作,则它可以工作。 我该如何解决? PS对不起,我的英语不好

  ask by Kurohige translate from so

本文未有回复,本站智能推荐:

1回复

H2数据库,使用Java CSVREAD合并到表中

美好的一天! 我有以下代码可以连接到H2数据库并使用Java执行查询。 但是,只有CALL CSVWRITE对我有用。 这是我的代码: 如您所见,唯一的区别是要执行的查询。 我对两者都使用了相同的方法,但对于tagExport函数似乎不起作用。 我只想再次连接到数据库,并将
4回复

从H2数据库中的大表中选择随机行

我的数据库中有一张大表(可能有数百万条记录),我需要选择#X个随机行(假设#X在10到50之间),但是我需要此查询尽可能地优化。 该表如下所示: 我到处搜索,发现了这样的答案: 但是在我看来,这将获取完整表然后对其进行排序,不是吗? 我认为最好是生成10或50个随机整
2回复

从H2数据库引擎中的表计数入场

我知道我可以用 但我不知道如何在Java中执行该操作。 这是我执行SQL命令的代码。 结果: 但它应该返回> 20 我的代码:
1回复

损坏的 H2 数据库。 使用恢复工具恢复失败

今天我的 H2 数据库之一连接失败并显示以下错误消息: 正如我所建议的那样,我尝试按照文档的说明使用恢复工具,我执行的步骤如下: 转到您的 h2 数据文件目录 java -cp h2-1.4.200.jar org.h2.tools.Recover 使用恢复工具生成的SQL文件重新
2回复

Mysql兼容的内存数据库(h2)中的查询错误

我试图在我的Spring Boot应用程序上执行一些集成测试。发现内存数据库很适合我们的需求。 决定使用h2数据库。目前我们正在使用mysql 5.5版本。我从mysql中转储了create查询。 示例查询:- 我在pom.xml中使用以下依赖项:- 如果我在h2上执行此查询
2回复

H2数据库:从外键约束引用根模式中的表

给定根模式中的表: 和Quiz架构中的表格: 我无法实际创建外键,因为数据库声称表user实际上并不存在。 我随后也不能添加外键: 当然,这两个表都存储在同一个数据库中。 由于这只是一个功课,我很乐意简单地跳过添加外键。 但我很好奇这是否确实是H2中的限制,一个
1回复

有效地从H2数据库检索数据

在我当前的项目中,我使用H2数据库存储JTable中的数据(准确地说是TableModel的数据)。 我已经编写了保存表中所有列的代码,现在我想再次检索数据(从数据库中加载)。 到目前为止,还不错,但是我无法提出从数据库中检索数据并将其完善以再次添加到表中的任何好方法。 我的表有一
1回复

MySQL到H2 DDL的问题

我在MySQL中创建了一个已启动的表,它工作正常。 但是我已经为测试目的定义了一个带有H2的内存数据库,该数据库使用相同的DDL来克隆可以测试我的应用程序的表。 但是,当我尝试初始化表进行测试时,它会吐出此错误: 引起原因:org.h2.jdbc.JdbcSQLExcepti