簡體   English   中英

使用本機 SQL 創建表適用於 Hibernate/HSQLDB,插入失敗。 為什么?

[英]Create table with native SQL works for Hibernate/HSQLDB, insert fails. Why?

我使用 HSQLDB 和 Hibernate。 我必須在數據庫級別(觸發器......)實現一些功能,因此我必須執行一些本機 SQL。 我創建了一個新表(有效),然后嘗試插入一些數據(失敗)。 我以 SA 身份執行此操作,因此不應違反訪問權限。 有人可以猜到為什么user lacks privilege or object not found: A492Interface is throw?

這是我的代碼(簡化):

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

更新:似乎我無法執行任何插入語句。 如果我嘗試將數據插入另一個表,這也會失敗。 我一定是在做一些非常愚蠢的事情……但沒看到……

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

錯誤是對字符串使用雙引號而不是單引號。

除了單引號和雙引號之外,如果您從前端傳遞值,您應該真正使用綁定變量,以便用戶無法傳遞會混淆串聯動態 SQL 的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM