首页 > 解决方案 > Apache calcite:解析失败:遇到“来自\””

问题描述

我目前正在尝试使用方解石连接 mysql。但是,我在执行 SQL 语句时遇到了问题

当我使用这个 sql 执行时,它可以工作。

ResultSet resultSet = statement.executeQuery("select * from ex.depts");

但我想访问一个名为“primary_test”的表,它失败了。

线程“main”java.sql.SQLException 中的异常:执行 SQL“select * from ex.primary_test”时出错:从第 1 行第 15 列到第 1 行第 29 列:在 org 的“ex”中找不到对象“primary_test” .apache.calcite.avatica.Helper.createException(Helper.java:56) 在 org.apache.calcite.avatica.Helper.createException(Helper.java:41) 在 org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement .java:163) 在 org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaStatement.java:227) 在 CalciteMysqlConnectionIns.main(CalciteMysqlConnectionIns.java:44) 引起:org.apache.calcite.runtime.CalciteContextException:从行1,第 15 列到第 1 行,第 29 列:在 sun.reflect 的“ex”中找不到对象“primary_test”。NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor. java:423) 在 org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:463) 在 org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:787) 在 org.apache.calcite org.apache.calcite.sql.validate.SqlValidatorImpl.newValidationError(SqlValidatorImpl.java:4788) 处的 .sql.SqlUtil.newContextException(SqlUtil.java:772) org.apache.calcite.sql.validate.IdentifierNamespace.resolveImpl(IdentifierNamespace .java:166) 在 org.apache.calcite.sql.validate.IdentifierNamespace。org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:84) 上 org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:977) 上的 validateImpl(IdentifierNamespace.java:177)在 org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:953) 在 org.apache.calcite.sql.validate.SqlValidatorImpl.validateFrom(SqlValidatorImpl.java:3050) 在 org.apache.calcite.sql .validate.SqlValidatorImpl.validateFrom(SqlValidatorImpl.java:3032) 在 org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:3302) 在 org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace .java:60) 在 org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:84) 在 org.apache.calcite。org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:953) 在 org.apache.calcite.sql.SqlSelect.validate(SqlSelect. java:216) 在 org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:632) 在 org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:928) 在 org.apache .calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:556) 在 org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:265) 在 org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java :231) 在 org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:772) 在 org.apache.calcite.prepare.CalcitePrepareImpl。prepare_(CalcitePrepareImpl.java:636) 在 org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:606) 在 org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:229) 在 org.apache .calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:550) at org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:675) at org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java :156) ... 2 更多原因:org.apache.calcite.sql.validate.SqlValidatorException:在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect 的“ex”中找不到对象“primary_test”。 NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources .java:463) 在 org.apache.calcite.runtime.Resources$ExInst.ex(Resources.java:572) ... 30 更多

我使用了许多不同的查询,例如

ResultSet resultSet = statement.executeQuery("select * from ex.\"primary_test\"");

但它不起作用。有人可以帮我解决这个问题吗?

我的代码如下:

import java.io.PrintStream;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import org.apache.calcite.adapter.jdbc.JdbcSchema;
import org.apache.calcite.jdbc.CalciteConnection;
import org.apache.calcite.schema.Schema;
import org.apache.calcite.schema.SchemaPlus;
import org.apache.commons.dbcp2.BasicDataSource;

public class CalciteMysqlConnectionIns {

  public static void main(String[] args) throws ClassNotFoundException, SQLException {

    Class.forName("org.apache.calcite.jdbc.Driver");

    Properties info = new Properties();
    info.setProperty("lex", "JAVA");
    Connection connection = DriverManager.getConnection("jdbc:calcite:", info);
    CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class);
    SchemaPlus rootSchema = calciteConnection.getRootSchema();

    // 本地Schema.
    // Schema schema = ReflectiveSchema.create(calciteConnection, rootSchema, "hr",
    // new HrSchema());

    Class.forName("com.mysql.jdbc.Driver");
    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setUrl("jdbc:mysql://192.168.130.7/hr");
    dataSource.setUsername("root");
    dataSource.setPassword("123456");
    Schema schema = JdbcSchema.create(rootSchema, "ex", dataSource, null, "sql_learn");

    rootSchema.add("ex", schema);
//    System.out.println(calciteConnection.getMetaData());
    DatabaseMetaData databaseMetaData = calciteConnection.getMetaData();
//    ResultSet rs = databaseMetaData.getTables(null, null, "%", new String[]{"TABLE"});
    Statement statement = calciteConnection.createStatement();
    ResultSet resultSet = statement.executeQuery(
        "select * from ex.\"primary_test\"");

    output(resultSet, System.out);
    resultSet.close();
    statement.close();
    connection.close();
  }

  private static void output(ResultSet resultSet, PrintStream out) throws SQLException {
    final ResultSetMetaData metaData = resultSet.getMetaData();
    final int columnCount = metaData.getColumnCount();
//    out.println(metaData.getColumnLabel(1) + " " + metaData.getColumnLabel(2));
//    out.println(metaData.getColumnTypeName(1) + " " + metaData.getColumnTypeName(2));
    while (resultSet.next()) {
      for (int i = 1; ; i++) {
        out.print(resultSet.getString(i));
        if (i < columnCount) {
          out.print(", ");
        } else {
          out.println();
          break;
        }
      }
    }
  }
}

标签: mysqljdbcapache-calcite

解决方案


你可以试试这个:

select * from ex.`primary_test`

推荐阅读