Java H2数据库不接受表名作为命名参数
尝试对内存中H2版本1.4.181表运行以下查询时遇到问题: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
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);