使用本机 SQL 创建表适用于 Hibernate/HSQLDB,插入失败。为啥?

Posted

技术标签:

【中文标题】使用本机 SQL 创建表适用于 Hibernate/HSQLDB,插入失败。为啥?【英文标题】:Create table with native SQL works for Hibernate/HSQLDB, insert fails. Why?使用本机 SQL 创建表适用于 Hibernate/HSQLDB,插入失败。为什么? 【发布时间】:2011-07-21 09:38:25 【问题描述】:

我使用 HSQLDB 和 Hibernate。我必须在数据库级别实现一些功能(触发器......),因此我必须执行一些本机 SQL。我创建了一个新表(有效),然后尝试插入一些数据(失败)。我以 SA 身份执行此操作,因此不应违反访问权限。有人可以猜到为什么会抛出user lacks privilege or object not found: A492Interface

这是我的代码(简化):

session.createSQLQuery("CREATE TABLE entity_table_map (entity_name VARCHAR(50) NOT NULL PRIMARY KEY,table_name VARCHAR(50) NOT NULL)").executeUpdate();
session.createSQLQuery("INSERT INTO entity_table_map (entity_name,table_name) VALUES (\"A429Interface\",\"interface\")").executeUpdate();

以下是相关日志:

[Server@19616c7]: 0:SQLCLI:SQLPREPARE CREATE TABLE entity_table_map (entity_name VARCHAR(50) NOT NULL PRIMARY KEY,table_name VARCHAR(50) NOT NULL)
[Server@19616c7]: 0:SQLCLI:SQLEXECUTE:5
[Server@19616c7]: 0:SQLCLI:SQLFREESTMT:5
[Server@19616c7]: 0:HSQLCLI:GETSESSIONATTR
[Server@19616c7]: 0:SQLCLI:SQLPREPARE INSERT INTO entity_table_map (entity_name,table_name) VALUES ("A492Interface","interface")
[Server@19616c7]: [Thread[HSQLDB Connection @13adc56,5,HSQLDB Connections @19616c7]]: 0:disconnected SA

这里有一个例外:

Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute native bulk manipulation query
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:219)
    at org.hibernate.impl.SessionImpl.executeNativeUpdate(SessionImpl.java:1310)
    at org.hibernate.impl.SQLQueryImpl.executeUpdate(SQLQueryImpl.java:396)
    at version.api.VersionAPI.setupDatabase(VersionAPI.java:38)
    at test.ui.VersionUI.setupDatabase(VersionUI.java:107)
    at test.SetupDatabase.main(SetupDatabase.java:9)
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: A492Interface
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)
    at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
    at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534)
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:116)
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
    at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:202)
    ... 5 more

更新:似乎我无法执行任何插入语句。如果我尝试将数据插入另一个表,这也会失败。我一定是在做一些非常愚蠢的事情......但没有看到......

【问题讨论】:

...user lacks privilege...你有权限插入这个表吗? 【参考方案1】:

OP提到的错误的详细信息。

session.createSQLQuery("INSERT INTO entity_table_map (entity_name,table_name) 
VALUES (\"A429Interface\",\"interface\")").executeUpdate();

在上面的 SQL 语句中,插入的两个值都是字符串,因此必须使用单引号(字符串的 SQL 引号字符)。

当使用双引号(变量、列和表名的 SQL 引号字符)时,引擎希望找到名为“A429Interface”、“interface”的变量以插入到表中。由于不存在此类变量,因此报告user lacks privilege or object not found: A492Interface

【讨论】:

【参考方案2】:

错误是对字符串使用双引号而不是单引号。

【讨论】:

【参考方案3】:

除了单引号和双引号之外,如果您从前端传入值,您应该真正使用绑定变量,这样用户就无法传入会混淆串联动态 SQL 的值。

【讨论】:

嗯?我不在这里传递任何变量......至少我不打算这样做。我只是静态初始化我的数据库。 感谢您的澄清...我的困惑

以上是关于使用本机 SQL 创建表适用于 Hibernate/HSQLDB,插入失败。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Hibernate 3.2.2 的本机 sql 查询中使用 IN 子句

Hibernate中带有命名查询的可选参数?

从请求响应创建 PDF 不适用于 axios,但适用于本机 xhr

我可以在不创建实体类的情况下对大型 sql 使用休眠命名查询吗?

Hibernate创建表不成功,sql语法错误

如何在 JPA/Hibernate 中执行本机 SQL 脚本?