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

时间:2014-09-24 21:14:59

标签: 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.JdbcSQLException: Syntax error in SQL statement "SHOW COLUMNS FROM ?[*] "; expected "identifier"; SQL statement: show columns from ? [42001-181]
...
...
...

我做了一些debbuging,我发现在解析查询时,字符“?”进行测试以检查它是否是有效的识别符并且它失败,导致异常的增加(类org.h2.command.Parser,第3027行):

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

我认为这是一个错误。你怎么想?

2 个答案:

答案 0 :(得分:0)

不,这很正常。 Hibernate不可能制作它的PreparedStatement。

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

DatabaseMetaData dbMeta = connection.getMetaData();

然后getColumns可用于接收杂项信息的ResultSet。

答案 1 :(得分:0)

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

     String sqlQuery = "show columns from " + tableName;
     Class<?> entity = Class.forName(entityName);
    
     session.createSQLQuery(sqlQuery);
    
  • 获取元数据信息&amp;然后可以从中检索所需的详细信息。

      

    String [] properties =   sessionFactory.getClassMetadata(entityClass)方法.getPropertyNames();

    还有其他一些方法可以获取元信息,可以参考ClassMetaData

[我还没有检查过Criteria API,如果发现任何相关内容会更新,你可以尝试一下]

相关问题