Java H2数据库不接受表名作为命名参数

Java H2数据库不接受表名作为命名参数,java,sql,h2,Java,Sql,H2,尝试对内存中H2版本1.4.181表运行以下查询时遇到问题: Object result = hibernateSession .createSQLQuery("show columns from :myTable") .setString("myTable", "some_table") .list(); 此查询导致以下异常: Caused by: org.h2.jdbc.JdbcSQ

尝试对内存中H2版本1.4.181表运行以下查询时遇到问题:

Object result = hibernateSession
                  .createSQLQuery("show columns from :myTable")
                  .setString("myTable", "some_table")
                  .list();
此查询导致以下异常:

Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "SHOW COLUMNS FROM ?[*] "; expected "identifier"; SQL statement: show columns from ? [42001-181]
...
...
...
我做了一些除错,发现在解析查询时,字符?测试以检查它是否为有效标识符,但失败,导致异常类org.h2.command.Parser出现,第3027行:

//currentToken is "?" at this point
if (currentTokenType != IDENTIFIER) {
        throw DbException.getSyntaxError(sqlCommand, parseIndex,
                "identifier");
    }

我认为这是一个错误。你怎么想?不,这很正常。Hibernate不可能对此做一个事先准备好的陈述

标准JDBC有许多可能性以独立于数据库供应商的方式查询模式等

DatabaseMetaData dbMeta = connection.getMetaData();
然后可用于接收杂项信息的结果集

您可以尝试创建所需的查询,而不是将表名设置为命名参数,这将不起作用

获取元数据信息&然后可以从中检索所需的详细信息

字符串[]属性= sessionFactory.getClassMetadataentityClass.getPropertyNames

还有其他几种方法可以获取元信息,可以参考


[我没有检查Criteria API,如果发现任何相关内容,将进行更新,您可以尝试]

SQL绑定变量不能引用这样的元数据。您需要从某个_表生成动态SQL,比如show列,然后执行它。
 String sqlQuery = "show columns from " + tableName;
 Class<?> entity = Class.forName(entityName);

 session.createSQLQuery(sqlQuery);