HSQL数据库用户缺少权限或对象未找到错误

Raj*_*lli 28 java spring hsqldb spring-jdbc

我试图使用hsqldb-2.3.4从Spring应用程序连接.

我使用以下详细信息创建了数据库

Type : HSQL Database Engine Standalone
Driver: org.hsqldb.jdbcDriver
URL: jdbc:hsqldb:file:mydb
UserName: SA
Password: SA
Run Code Online (Sandbox Code Playgroud)

我在"MYDB"模式下创建了一个名为ALBUM的表

在spring配置文件中:

<bean id="jdbcTemplate"
    class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="dbcpDataSource" />
</bean>

<bean id="dbcpDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
    <property name="url" value="jdbc:hsqldb:file:mydb" />
    <property name="username" value="SA" />
    <property name="password" value="SA" />
</bean>
Run Code Online (Sandbox Code Playgroud)

在我的春季控制器中,我正在做 jdbcTemplate.query("SELECT * FROM MYDB.ALBUM", new AlbumRowMapper());

它给了我例外:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT * FROM MYDB.ALBUM]; nested exception is java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: ALBUM
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Run Code Online (Sandbox Code Playgroud)

如果我通过hsqldb的SQL编辑器执行相同的查询,它执行正常.你能帮我解决这个问题吗?

Dam*_*RAS 12

正如之前的回复所说,可能的原因有很多。其中之一是由于语法不兼容而未创建表。如果使用特定的 DB 供应商语法或特定功能,HSQLDB 将无法识别它。然后在执行创建代码时,您可以看到由于此语法原因未创建表。例如,如果实体被注释@Column(columnDefinition = "TEXT")为表的创建将失败。

有一种解决方法告诉 HSQLDB 处于 pgsl 的兼容模式,您应该将连接 url 附加到

"spring.datasource.url=jdbc:hsqldb:mem:testdb;sql.syntax_pgs=true"
Run Code Online (Sandbox Code Playgroud)

mysql

"spring.datasource.url=jdbc:hsqldb:mem:testdb;sql.syntax_mys=true"
Run Code Online (Sandbox Code Playgroud)

甲骨文

"spring.datasource.url=jdbc:hsqldb:mem:testdb;sql.syntax_ora=true" 
Run Code Online (Sandbox Code Playgroud)

请注意,根据您的配置,它可能会有所不同,hibernate.connection.url=或者spring.datasource.url= 对于那些不使用休眠模式创建但使用 SQL 脚本的人,您应该在脚本中使用这种语法

SET DATABASE SQL SYNTAX ORA TRUE;
Run Code Online (Sandbox Code Playgroud)

它还将解决由于 SQL 请求中的供应商特定语法(例如posgresqlarray_agg)引起的问题

注意:当代码解析模型以创建模式然后隐藏在多行日志中时,问题很早就出现了,然后 unitTested 代码崩溃并出现令人困惑和模糊的异常“用户缺少权限或找不到对象错误”这根本没有指出真正的问题。因此,请确保从头开始阅读所有跟踪并解决所有可能的问题


Art*_*eda 9

user lacks privilege or object not found可能有多种原因,最明显的是你正在访问一个不存在的表.一个不太明显的原因是,当您运行代码时,与文件数据库URL的连接实际上可以创建数据库.您遇到的情况可能是您使用HSQL数据库管理器设置了数据库,添加了表和行,但这不是您的Java代码正在使用的特定实例.您可能要检查你没有这些文件的多个副本:mydb.log,mydb.lck,mydb.properties,等在您的工作空间.如果您的Java代码确实创建了这些文件,则位置取决于您运行程序的方式.例如,在Netbeans内部运行的Maven项目中,文件与pom.xml一起存储.

  • 我正在使用 PGSQL 并使用 HSQL 运行测试。我正在测试一个服务,但另一个服务仍然连接到 PGSQL 数据库。这就是导致我出现错误的原因:尝试使用 HSQL 测试服务时运行 PGSQL。当我停止 PGSQL 实例后,错误就消失了。 (2认同)

Ner*_*rve 5

如果您已经尝试过此问题的所有其他答案,那么很可能会遇到区分大小写的问题。

默认情况下,HSQLDB区分大小写。如果未在模式,列或表的名称周围指定双引号,则默认情况下会将其转换为大写。如果您的对象是用大写字母创建的,那么您很幸运。如果是小写字母,则必须用双引号将对象名称引起来。

例如:

CREATE MEMORY TABLE "t1"("product_id" INTEGER NOT NULL)
Run Code Online (Sandbox Code Playgroud)

要从该表中选择,您将必须使用以下查询

select "product_id" from "t1"
Run Code Online (Sandbox Code Playgroud)