java - 找不到带有 apache 方解石的表

标签 java apache-calcite

我正在尝试用方解石做一些基本的事情来理解这个框架。我已经设置了一个应该从 2 个 json 文件中读取的简单示例。我的模型看起来像

{
  version: '1.0',
  defaultSchema: 'PEOPLE',
  schemas: [
    {
      name: 'PEOPLE',
      type: 'custom',
      factory: 'demo.JsonSchemaFactory',
      operand: {
        directory: '/..../calcite-json/src/test/resources/files'
      }
    }
  ]
}

在我的测试中,似乎模型加载正常,因为当我提取数据库元数据信息时,我可以看到我的文件正在作为 PEOPLE 模式下的表加载。但是在该语句之后,我试图从该表中执行 select * 操作,但我收到一条错误消息,指出未找到该表。

> --
null
PEOPLE
a
TABLE
-->
Jun 29, 2015 8:53:30 AM org.apache.calcite.sql.validate.SqlValidatorException <init>
SEVERE: org.apache.calcite.sql.validate.SqlValidatorException: Table 'A' not found
Jun 29, 2015 8:53:30 AM org.apache.calcite.runtime.CalciteException <init>
SEVERE: org.apache.calcite.runtime.CalciteContextException: At line 1, column 26: Table 'A' not found

输出中的第一行显示来自数据库元数据的表“-- null PEOPLE a TABLE -->”。这表明表“a”存在于模式“people”下,类型为“table”。

我的测试代码是这样的

@Test
public void testModel() throws SQLException {
    Properties props = new Properties();
    props.put("model", getPath("/model.json"));
    System.out.println("model = " + props.get("model"));
    Connection conn = DriverManager.getConnection("jdbc:calcite:", props);

    DatabaseMetaData md = conn.getMetaData();
    ResultSet tables = md.getTables(null, "PEOPLE", "%", null);
    while (tables.next()) {
        System.out.println("--");
        System.out.println(tables.getString(1));
        System.out.println(tables.getString(2));
        System.out.println(tables.getString(3));
        System.out.println(tables.getString(4));
        System.out.println("-->");
    }

    Statement stat = conn.createStatement();
    stat.execute("select _MAP['name'] from a");

    stat.close();
    conn.close();
}

为什么我无法在加载的表上进行选择?有什么想法吗?

我注意到的另一件有趣的事情是,对于 1 个文件,Schema.getTableMap 被调用了 4 次。

可以找到该项目的完整代码on github

最佳答案

问题是区分大小写。因为您没有将表名括在双引号中,所以 Calcite 的 SQL 解析器将其转换为大写。因为该文件名为“a.json”,所以该表也称为“a”,而您的查询正在查找名为“A”的表。

解决方案是按如下方式编写您的查询:

select _MAP['name'] from "a"

这变成了:

stat.execute("select _MAP['name'] from \"a\"");

当您将它嵌入到 Java 中时。

关于java - 找不到带有 apache 方解石的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31118348/

相关文章:

apache-calcite - Apache 方解石 |使用关系代数从 MongoDB 查询数据

java - 你如何使用计时器在 android 中制作秒表?

Java Apache FTPClient API : Why isn't logout() in finally clause?

java - Avatica Calcite JDBC 驱动程序问题

将 Apache Calcite 作为库嵌入到我的应用程序中

Javassist - 如何将方法注入(inject) JAR 中的类

java - 配置@BeforeClass 和@Before 方法的模式

java - 实时到 firestore 相当于 .push()

java - Apache Calcite 在 SQL 字符串中查找选定的列