【问题标题】:Syntax issue with HSQL sequence: `NEXTVAL` instead of `NEXT VALUE`HSQL 序列的语法问题:`NEXTVAL` 而不是 `NEXT VALUE`
【发布时间】:2014-02-07 01:51:15
【问题描述】:

我在 Jetty 服务器上部署了 webapp,并连接到位于 HSQLDB 服务器上的 HSQLDB 数据库。尝试创建实体时出现此错误:

ERROR org.hibernate.util.JDBCExceptionReporter Unexpected token: NEXTVAL in statement [/* 动态原生 SQL 查询 */ SELECT nextval('campagne_sequence')]

我将序列初始化如下:

CREATE SEQUENCE PUBLIC.CAMPAGNE_SEQUENCE START WITH 1 INCREMENT BY 1

在我的 webapp 中,我将 Hibernate 方言设置为 org.hibernate.dialect.HSQLDialect

我检查了创建序列的语法,它是正确的。我正在使用 hsqldb-1.8.0.10 并且我还检查了下一个版本的语法是否已更改,它没有。

我知道正确的语法是 NEXT VALUE 而不是 NEXTVAL 就像在 PostgreSQL 中一样,但我不知道如何修复它。谁能帮我这个?谢谢

编辑:

在测试环境中,一切正常。我所有的测试都运行良好。但是在开发环境中,当我尝试创建 Campagne 时出现错误。有一个测试也可以创建一个并且它可以工作。所以它应该适用于 hsqldb-1.8.0.10 版本。

我尝试在数据库 URL 后添加字符串 ;sql.syntax_pgs=true,没有成功。

编辑:

这是我得到的完整堆栈跟踪:

2014-01-22 10:24:22,813 [RMI TCP Connection(6)-127.0.0.1] WARN  org.hibernate.util.JDBCExceptionReporter SQL Error: -11, SQLState: 37000
2014-01-22 10:24:22,820 [RMI TCP Connection(6)-127.0.0.1] ERROR org.hibernate.util.JDBCExceptionReporter Unexpected token: NEXTVAL in statement [/* dynamic native SQL query */ SELECT nextval('campagne_sequence')]
2014-01-22 10:24:22,827 [RMI TCP Connection(6)-127.0.0.1] WARN  org.springframework.remoting.support.RemoteInvocationTraceInterceptor Processing of RmiServiceExporter remote call resulted in fatal exception: com.square.core.service.interfaces.CampagneService.creerCampagne
org.hibernate.exception.SQLGrammarException: could not execute query
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.loader.Loader.doList(Loader.java:2536)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
    at org.hibernate.loader.Loader.list(Loader.java:2271)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316)
    at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842)
    at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
    at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157)
    at org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:859)
    at com.square.core.dao.implementations.CampagneDaoImplementation.rechercherSequence(CampagneDaoImplementation.java:169)
    at com.square.core.util.sequence.CampagneSequenceUtilImpl.rechercherSequence(CampagneSequenceUtilImpl.java:32)
    at com.square.core.service.implementations.CampagneServiceImplementation.creerCampagne(CampagneServiceImplementation.java:156)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at $Proxy263.creerCampagne(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
    at org.springframework.security.intercept.method.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:66)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at $Proxy264.creerCampagne(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
    at org.springframework.remoting.support.RemoteInvocationTraceInterceptor.invoke(RemoteInvocationTraceInterceptor.java:77)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at $Proxy263.creerCampagne(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.springframework.remoting.support.RemoteInvocation.invoke(RemoteInvocation.java:205)
    at org.springframework.security.context.rmi.ContextPropagatingRemoteInvocation.invoke(ContextPropagatingRemoteInvocation.java:103)
    at org.springframework.remoting.support.DefaultRemoteInvocationExecutor.invoke(DefaultRemoteInvocationExecutor.java:38)
    at org.springframework.remoting.support.RemoteInvocationBasedExporter.invoke(RemoteInvocationBasedExporter.java:78)
    at org.springframework.remoting.rmi.RmiBasedExporter.invoke(RmiBasedExporter.java:72)
    at org.springframework.remoting.rmi.RmiInvocationWrapper.invoke(RmiInvocationWrapper.java:72)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322)
    at sun.rmi.transport.Transport$1.run(Transport.java:177)
    at sun.rmi.transport.Transport$1.run(Transport.java:174)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
Caused by: java.sql.SQLException: Unexpected token: NEXTVAL in statement [/* dynamic native SQL query */ SELECT nextval('campagne_sequence')]
    at org.hsqldb.jdbc.Util.throwError(Unknown Source)
    at org.hsqldb.jdbc.jdbcPreparedStatement.<init>(Unknown Source)
    at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source)
    at org.apache.commons.dbcp.DelegatingConnection.prepareStatement(DelegatingConnection.java:171)
    at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareStatement(PoolingDataSource.java:278)
    at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534)
    at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:452)
    at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1700)
    at org.hibernate.loader.Loader.doQuery(Loader.java:801)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
    at org.hibernate.loader.Loader.doList(Loader.java:2533)
    ... 68 more

【问题讨论】:

    标签: hibernate hsqldb dialect


    【解决方案1】:

    根据 QUERY 评论 /* dynamic native SQL query */,查询不是由方言生成,而是由原生 SQL 查询生成,因此修复查询将解决问题。

    查看项目代码,看看是否有使用 nextval 调用序列的本机查询。

    【讨论】:

    • HSQLDialect 所在的类是 jar hibernate-core-3.6.0.Final.jar。这两种方法和你说的完全一样。在评论部分,它说this version supports HSQLDB version 1.8 and higher,我使用hsqldb-1.8.0.10。该版本也设置了类:int hsqldbVersion = 18;.
    • OK,这样可以确认语法错误的查询不是由方言编写的。查询 /*动态原生 SQL 查询*/ 的注释表示此查询是原生查询,直接在应用程序代码而不是框架中创建,例如使用 entityManager.createNativeQuery()。如果在代码中搜索 nextval 没有返回任何内容,您可以发布完整的堆栈跟踪吗?因为如果不是应用程序编写此查询,那么它涉及到其他一些框架/库,堆栈跟踪会告诉我们是哪一个。
    • 嗯,很长..我不能全部添加
    • 我在我的问题中添加了第一部分
    • 正是这些方法 CampagneDaoImplementation.rechercherSequence() / CampagneSequenceUtilImpl.rechercherSequence() 进行本机查询。你能发布这些方法吗?
    【解决方案2】:

    如果您创建表 ONE_ROW_TABLE 并在其中插入一行,则可以将其与 HSQLDB 版本 1.8.0 及更高版本一起使用。

     SELECT NEXT VALUE FOR campagne_sequence FROM ONE_ROW_TABLE
    

    但是您应该迁移到 HSQLDB 版本 2.3.x,它为您提供以下选项:

     VALUES NEXT VALUE FOR campagne_sequence
    

    或使用与PostgreSQL相同的方法,将此字符串添加到数据库URL的末尾;sql.syntax_pgs=true以在HSQLDB中启用PostgreSQL语法兼容模式。

     SELECT nextval('campagne_sequence')
    

    【讨论】:

    • 好吧..它没有用。我将此字符串添加到 Hsqldb 服务器的 server.properties 和我的 web 应用程序中。我宁愿不升级我的Hsqldb版本,两个版本之间有修改,作为数据源bean的名称(1.8:jdbcDataSource;2.3:JDBCDataSource),但我不知道所有这些。但如果这是唯一的方法,我会这样做
    • 一切正常。问题是,它在具有数据集和内存中的数据库的测试环境中运行良好,但在具有归档数据库的开发环境中运行良好。我检查了项目和父项目或插件中的所有依赖项,我只有 hslqdb-1.8.0.10 或 hsqldb-1.8.0.7
    猜你喜欢
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多