我在尝试针对内存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");
}
我认为这是一个错误。你怎么想?
答案 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,如果发现任何相关内容会更新,你可以尝试一下]