Создание таблицы с собственным SQL работает для Hibernate / HSQLDB, вставка не удалась. Зачем? - PullRequest
0 голосов
/ 21 июля 2011

Я использую 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

Обновление: Кажется, я не могу выполнить какой-либо оператор вставки.Если я пытаюсь вставить данные в другую таблицу, это тоже не получается.Я, должно быть, делал что-то действительно глупое ... но не видел этого ...

Ответы [ 3 ]

3 голосов
/ 21 июля 2011

Сведения об ошибке, указанной в 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

0 голосов
/ 22 июля 2011

Помимо одинарных кавычек и двойных кавычек, если вы передаете значения из внешнего интерфейса, вам действительно следует использовать переменные связывания, чтобы пользователи не могли передавать значения, которые могли бы испортить сцепленный динамический SQL.

0 голосов
/ 21 июля 2011

Ошибка заключалась в использовании двойных кавычек для строк вместо одинарных кавычек.

...